2015-05-27 2 views
3

Сегодня я пытаюсь понять, как работать в контексте лямбда-исчисления в Схеме/Ракетке, но я не могу понять, как написать эквивалент let в качестве лямбда-функции.Каким будет определение лямбда let в Scheme/Racket?

Я думаю, что общая форма этого должно быть что-то вроде этого:

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

но, безусловно, это не полное определение функции.

Любые идеи правильного/полного определения для этого?

Спасибо заранее!

ответ

4

От R5RS, определение let является:

(define-syntax let 
    (syntax-rules() 
    ((let ((name val) ...) body1 body2 ...) 
     ((lambda (name ...) body1 body2 ...) 
     val ...)) 
    ((let tag ((name val) ...) body1 body2 ...) 
     ((letrec ((tag (lambda (name ...) 
         body1 body2 ...))) 
     tag) 
     val ...)))) 
5

Ваш пример

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

это именно то, что

(let ([p1 v1] [p2 v2] ...) body) 

средства.

Вы можете превратить ваш пример в макрос, как это:

#lang racket 

(define-syntax my-let 
    (syntax-rules() 
    [(_my-let ([p1 v1] [p2 v2] ...) body) 
    ((lambda (p1 p2 ...) body) v1 v2 ...)])) 

(my-let ([x 1] 
     [y 2]) 
    (+ x y)) 

Результатом программы является 3.