Как реализовать let в качестве лямбда-функции в Scheme - PullRequest
0 голосов
/ 20 февраля 2011

В качестве упражнения я пытаюсь определить let как лямбда-функцию примерно так:

(define let_as_lambda 
  (lambda (var) 
     (lambda (value body) 
       (var body) val)))

И я надеюсь назвать это так:

((let_as_lambda a) (3 (+ a 2)))

Однако естьневозможно передать несвязанную переменную (в данном случае «a») в качестве аргумента функции.(Я знаю, это выглядит немного странно, но мне нужно let_as_lambda (var), чтобы вернуть функцию.)

Может кто-нибудь показать мне, как это сделать?Любой совет приветствуется.

На самом деле, просто используя это лямбда-эквивалентное выражение:

(let ((p1 v1) (p2 v2)...) body) = ((lambda (p1 p2...) body) v1 v2...)

Я даже не могу заставить это работать:

(define let_as_lambda 
    (lambda (var val body) 
      ((var body) val)))

Вызывается: (let_as_lambda a 3 (+ a 2))

Без получения той же жалобы:

ссылка на идентификатор до его определения: a

1 Ответ

4 голосов
/ 21 февраля 2011

let является синтетическим расширением, определенным в терминах lambda. Я не думаю, что вы можете определить это как функцию. Взгляните на пример из Язык программирования схем

...