From b7e98407f8a9eedb2c0873da60dbadb1822c5ca8 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Tue, 28 Jun 2016 00:24:35 -0700 Subject: [PATCH] language: funktors kind of work? --- language/eval/eval.factor | 7 ++++++- language/funktors/funktors-tests.factor | 19 +++++++++++++++++ language/funktors/funktors.factor | 28 ++++++++++--------------- language/interpolate/interpolate.factor | 3 +++ 4 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 language/funktors/funktors-tests.factor diff --git a/language/eval/eval.factor b/language/eval/eval.factor index f362c22ea9..e9abd96b3c 100644 --- a/language/eval/eval.factor +++ b/language/eval/eval.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: combinators compiler.units continuations debugger effects.parser io.streams.string kernel kernel.private multiline -namespaces parser parser.notes sequences splitting ; +namespaces parser parser.notes sequences splitting vocabs.parser ; IN: eval : parse-string ( str -- quot ) @@ -16,6 +16,11 @@ IN: eval SYNTAX: \ eval( \ eval parse-call-paren ; +: eval-in-current ( string effect -- output ) + [ (eval) ] with-current-manifest ; inline + +SYNTAX: \ eval-in-current( \ eval-in-current parse-call-paren ; + SYNTAX: \ eval[[ "]]" parse-multiline-string $[ get-datastack _ parse-string with-datastack set-datastack ] append! ; diff --git a/language/funktors/funktors-tests.factor b/language/funktors/funktors-tests.factor new file mode 100644 index 0000000000..7460c86b05 --- /dev/null +++ b/language/funktors/funktors-tests.factor @@ -0,0 +1,19 @@ +! Copyright (C) 2016 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: funktors math tools.test ; +IN: funktors.tests + +COMPILE< + +FUNKTOR: define-box ( T -- ) [[ +TUPLE: ${T}-box { value ${T} } ; +C: <${T}-box> ${T}-box +]] + +\ float define-box + +COMPILE> + +{ 1 0 } [ define-box ] must-infer-as + +[ T{ float-box f 5.0 } ] [ 5.0 ] unit-test \ No newline at end of file diff --git a/language/funktors/funktors.factor b/language/funktors/funktors.factor index 0151a07f3e..871eac94c6 100644 --- a/language/funktors/funktors.factor +++ b/language/funktors/funktors.factor @@ -1,20 +1,14 @@ -USING: accessors effects.parser eval grouping interpolate kernel -multiline namespaces parser sequences sets splitting -vocabs.parser words ; +! Copyright (C) 2016 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors arrays effects.parser eval interpolate +io.streams.string kernel locals.parser namespaces parser +sequences words ; IN: funktors -SYNTAX: \ funktor[[ "]]" parse-multiline-string - manifest get search-vocab-names>> - { "syntax" } diff members - current-vocab name>> ".private" ?tail drop ".private" append suffix - $[ - _ interpolate>string - current-vocab name>> "\nIN: " "\n" surround prepend - _ 5 group [ " " join ] map "\n" join - "USING: " " ;\n" surround prepend - eval( -- ) - ] suffix! ; - SYNTAX: \ FUNKTOR: - scan-new-escaped scan-effect scan-object - $[ _ call ] swap define-declared ; + scan-new-escaped + scan-effect dup in>> [ dup pair? [ first ] when ] map make-locals + drop [ name>> ] map reverse [ $[ _ namespaces:set ] ] map [ ] [ compose ] reduce + scan-object interpolate-locals-quot compose + $[ [ _ call ] with-string-writer eval-in-current( -- ) ] swap define-declared ; + ! $[ @ interpolate>string eval-in-current( -- ) ] swap define-declared ; \ No newline at end of file diff --git a/language/interpolate/interpolate.factor b/language/interpolate/interpolate.factor index b8ac7685cf..9cd61ce69b 100644 --- a/language/interpolate/interpolate.factor +++ b/language/interpolate/interpolate.factor @@ -88,3 +88,6 @@ MACRO: interpolate-locals ( str -- quot ) SYNTAX: \ I[[ "]]" parse-multiline-string interpolate-locals-quot append! ; + +SYNTAX: \ $[[ + "]]" parse-multiline-string interpolate-locals-quot append! ;