diff --git a/extra/lisp/lisp.factor b/extra/lisp/lisp.factor index 52faf59c17..8582021d6d 100644 --- a/extra/lisp/lisp.factor +++ b/extra/lisp/lisp.factor @@ -26,14 +26,14 @@ DEFER: funcall unclip convert-form swap convert-body [ , % funcall ] bake ; > swap member? [ name>> make-local ] [ ] if ] - [ dup s-exp? [ body>> localize-body ] [ nip ] if ] if - ] with map ; +: localize-body ( assoc body -- assoc newbody ) + [ dup lisp-symbol? [ over dupd [ name>> ] dip at swap or ] + [ dup s-exp? [ body>> localize-body ] when ] if + ] map ; : localize-lambda ( body vars -- newbody newvars ) - dup make-locals dup push-locals [ swap localize-body convert-form ] dipd - pop-locals swap ; + make-locals dup push-locals swap + [ swap localize-body convert-form swap pop-locals ] dip swap ; PRIVATE> diff --git a/extra/lisp/parser/parser-tests.factor b/extra/lisp/parser/parser-tests.factor index 9e6b54ab0c..98a6d2a6ba 100644 --- a/extra/lisp/parser/parser-tests.factor +++ b/extra/lisp/parser/parser-tests.factor @@ -8,6 +8,14 @@ IN: lisp.parser.tests "1234" "atom" \ lisp-expr rule parse parse-result-ast ] unit-test +{ -42 } [ + "-42" "atom" \ lisp-expr rule parse parse-result-ast +] unit-test + +{ 37/52 } [ + "37/52" "atom" \ lisp-expr rule parse parse-result-ast +] unit-test + { 123.98 } [ "123.98" "atom" \ lisp-expr rule parse parse-result-ast ] unit-test diff --git a/extra/lisp/parser/parser.factor b/extra/lisp/parser/parser.factor index 65ad01aa6f..32886f9367 100644 --- a/extra/lisp/parser/parser.factor +++ b/extra/lisp/parser/parser.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 James Cash ! See http://factorcode.org/license.txt for BSD license. USING: kernel peg.ebnf peg.expr math.parser sequences arrays strings -combinators.lib ; +combinators.lib math ; IN: lisp.parser @@ -18,9 +18,11 @@ RPAREN = ")" dquote = '"' squote = "'" digit = [0-9] -integer = (digit)+ => [[ string>number ]] -float = (digit)+ "." (digit)* => [[ first3 >string [ >string ] dipd 3append string>number ]] +integer = ("-")? (digit)+ => [[ first2 append string>number ]] +float = integer "." (digit)* => [[ first3 >string [ number>string ] dipd 3append string>number ]] +rational = integer "/" (digit)+ => [[ first3 nip string>number / ]] number = float + | rational | integer id-specials = "!" | "$" | "%" | "&" | "*" | "/" | ":" | "<" | " =" | ">" | "?" | "^" | "_" | "~" | "+" | "-" | "." | "@"