functional programming - SICP example doesn't work on Racket -
i trying example on chapter 4 of sicp (part of writing lisp interpreter)
(define (definition-value exp) (if (symbol? (cadr exp)) (caddr exp) (make-lambda (cdadr exp) ; formal parameters (cddr exp) ; body ) ) ) (define (make-lambda parameters body) (cons 'lambda (cons parameters body)) ) i tested it, definition-value on '(define (double x) (+ x x))) should return lambda function
( (definition-value '(define (double x) (+ x x))) 10) racket outputs
procedure application: expected procedure, given: (lambda (x) (+ x x)); arguments were: 10 isn't "(lambda (x) (+ x x))" procedure? or reference? if reference, way "dereference" it?
definition-value returns value in definition expression given argument:
(definition-value '(define x 42)) => 42 (definition-value '(define (qq x) (+ x y 42))) => (make-lambda '(x) '((+ x y 42))) => '(lambda (x) (+ x y 42)) you can't call quoted list function, do: ( '(lambda (x) (+ x y 42)) 10) invalid. not function, s-expression.
definition-value part of an interpreter. interpreter way "dereference", i.e. interpret function definitions. different interpreters can have different ways interpret same function definitions, giving different semantics resulting languages.
evaluation of expressions must done in context - appear inside lexical scope (area in code variable visible), gives rise environments (also, this). in example above, y defined in enclosing scope in program being interpreted. trying interpret expression in repl calling racket's eval, value y have?
Comments
Post a Comment