;;; (lambda (x) (+ x)) ;;; (lambda (x) ((: free +) (: 0 0))) (define lexical (lambda (datum bindings) (cond [(symbol? datum) (look-up datum bindings 0)] [(pair? datum) (cond [(eq? (car datum) 'lambda) (list 'lambda (cadr datum) (lexical (caddr datum) (cons (cadr datum) bindings)))] [else (list (lexical (car datum) bindings) (lexical (cadr datum) bindings))])] [else 'notImplemented]))) (define look-up (lambda (datum bindings depth) (cond [(null? bindings) (list ': 'free datum)] [(memq datum (car bindings)) (list ': depth (get-pos datum (car bindings)))] [else (look-up datum (cdr bindings) (+ depth 1))]))) (define get-pos (lambda (datum list) (cond [(null? list) 'error] [(eq? datum (car list)) 0] [else (+ 1 (get-pos datum (cdr list)))])))