diff --git a/package.json b/package.json index fa58470..eb42dcc 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "bin/lisp", "dependencies": { "coffee-script": "^1.9.1", - "git+https://github.com/elfsternberg/cons-lists.git" + "cons-lists": "git+https://github.com/elfsternberg/cons-lists.git" }, "devDependencies": { "chai": "^2.0.0", diff --git a/src/lisp_ch1.coffee b/src/lisp_ch1.coffee index 82138b4..362d891 100644 --- a/src/lisp_ch1.coffee +++ b/src/lisp_ch1.coffee @@ -1,4 +1,4 @@ -{listToString, listToVector, pairp, cons, car, cdr, caar, cddr, cdar, cadr, caadr, cadar, caddr, nilp, nil, setcdr, metacadr} = require "./lists" +{listToString, listToVector, pairp, cons, car, cdr, caar, cddr, cdar, cadr, caadr, cadar, caddr, nilp, nil, setcdr, metacadr} = require "cons-lists/lists" readline = require "readline" {inspect} = require "util" @@ -12,11 +12,11 @@ definitial = (name, value = nil) -> env_global = (cons (cons name, value), env_global) name -defprimitive = (name, value, arity) -> - definitial name, ((values) -> - vvalues = listToVector(values) - if (vvalues.length == arity) - return value(vvalues) +defprimitive = (name, nativ, arity) -> + definitial name, ((args) -> + vmargs = listToVector(args) + if (vmargs.length == arity) + nativ.apply null, vmargs else throw "Incorrect arity") @@ -31,7 +31,7 @@ definitial "fib" definitial "fact" defpredicate = (name, nativ, arity) -> - defprimitive name, ((args) -> if (nativ.apply null, args) then true else the_false_value), arity + defprimitive name, ((a, b) -> if nativ.call(null, a, b) then true else the_false_value), arity defprimitive "cons", cons, 2 defprimitive "car", car, 2 @@ -60,7 +60,7 @@ make_function = (variables, body, env) -> (values) -> eprogn body, (extend env, variables, values) invoke = (fn, args) -> - (fn(args)) + fn(args) # Takes a list of nodes and calls evaluate on each one, returning the # last one as the value of the total expression. In this example, we @@ -93,7 +93,7 @@ lookup = (id, env) -> update = (id, env, value) -> if (pairp env) if (caar env) == id - setcdr (car env), value + setcdr value, (car env) value else update id, (cdr env), value diff --git a/src/reader.coffee b/src/reader.coffee index f4fb431..152938d 100644 --- a/src/reader.coffee +++ b/src/reader.coffee @@ -1,4 +1,4 @@ -{car, cdr, cons, nil, nilp, pairp, vectorToList} = require './lists' +{car, cdr, cons, nil, nilp, pairp, vectorToList} = require 'cons-lists/lists' NEWLINES = ["\n", "\r", "\x0B", "\x0C"] WHITESPACE = [" ", "\t"].concat(NEWLINES) diff --git a/src/test_chap1.coffee b/src/test_chap1.coffee index b0bb143..33f1fc4 100644 --- a/src/test_chap1.coffee +++ b/src/test_chap1.coffee @@ -2,4 +2,8 @@ lisp = require './lisp_ch1' {read, readForms} = require './reader' {inspect} = require 'util' ast = read("(begin (set! fact (lambda (x) (if (eq? x 0) 1 (* x (fact (- x 1)))))) (fact 5))") + +# ast = read("(begin (if (lt 4 2) (+ 4 1) (+ 2 1)))") +# ast = read("(begin (set! fact 4) fact)") +ast = read("(begin ((lambda (t) (if (lt t 2) (+ 4 1) (+ 2 1))) 4))") console.log "Result:", (lisp ast)