используя лямбда вместо впускной схемы

В SICP 1.2.1 есть функция, которая делает рациональное число следующим образом:

(define (make-rat n d)
  (let ((g (gcd n d)))
    (cons (/ n g) (/ d g))))

Мне просто любопытно, как вы можете реализовать то же самое, используя лямбда вместо let, без двойного вызова GCD. Я не мог понять это сам.


person CamelCamelCamel    schedule 25.05.2010    source источник


Ответы (3)



Эти две вещи одинаковы:

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

и

(let ((p1 v1) (p2 v2)...) body)
person Amadan    schedule 25.05.2010

Давайте рассмотрим два простых случая, чтобы мы могли понять, как мы можем переписать любую функцию, которая использует let с лямбдой:

  1. В нашем первом случае у нас есть один let. Эта функция очень проста, она возвращает заданный ввод, добавляя к нему 10:

    (define (test x)
      (let ((b 10))
        (+ x b)))
    

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

    (define (test-lambda x)
      ((lambda (b)
         (+ x b))
       10))

Как видите, test-lambda возвращает лямбда-оценку, которая вычисляется со значением 10. Проверяя это, мы можем сказать:

    (test-lambda 10)

который вернет 20.

  1. Теперь для более чем одного let мы вкладываем лямбда-выражения в лямбда-выражения.

В нашем случае let у нас есть два оператора let:

    (define (lets x)
      (let ((a 10)
            (b 20))
        (+ x a b)))

Мы можем написать это с помощью лямбды так:

    (define (lets-lambda x)
      ((lambda (a)
         ((lambda (b)
            (+ x a b))
          20))
       10))

Итак, теперь мы оцениваем каждое из лямбда-выражений, присваивая им значение, а самое внутреннее лямбда-выражение заботится о том, что мы хотим вычислить, используя имена переменных, которые были присвоены каждому лямбда-выражению.

Надеюсь, это было ясно и может помочь другим увидеть более ясно!

person Arash Saidi    schedule 03.06.2013