Почему все лямбдас в маленькой схеме?
-
23-10-2019 - |
Вопрос
Узнав немного схемы от SICP, я начал читать маленький схему (который я нахожу довольно интересным), и примерно один четвертый. Я заметил, что могу написать много (большинство? Все?) Решения без использования лямбды, тогда как маленький схему всегда использует их. Например, самое первое определение
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
Что, если я не ошибаюсь, может быть написано более просто как
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
Я упускаю что-то фундаментальное, если я пишу решения без лямбды?
Решение
Первоначально, define
имел один синтаксис, чтобы установить переменную на значение. Это стиль, используемый в таких старых (и вневременных) книгах. Позже, define
Получил другой синтаксис в качестве ярлыка, который вы используете.
Просто для развлечения, поищите в библиотеках своих схемы, вы можете найти макрос, который расширяет форму без ламбды в старую ламбда-тяжелую.
Другие советы
Я настоятельно предпочитаю lambda
-Стиль преподавания, поскольку он делает создание функции более явным, как говорит Джей.
При обучении простые функции, с которыми вы начинаете atom?
находятся define
D на верхнем уровне. Это означает, что это возможно и еще более компактно создать функцию с defun
-стиль define
Вы упоминаете.
Однако, когда вы начинаете использовать функции в качестве первоклассных значений, например, в качестве аргумента map
, ты увидишь lambda
Впервые, и это может показаться более странным и волшебным, чем на самом деле.
Вместо этого, если вы определяли свои функции с помощью lambda
Все время, это меньше прыжков, чтобы видеть, что функции, как и любое другое значение. Они оказались в правой части define
довольно часто, но ничем не отличается от числа или цитируемой постоянной:
(define x 1)
(define l '(2 3 4 5))
(define s (cons x ls))
(define f (lambda (n) (+ n 2)))
Конечно, язык поддерживает обе формы, так что в конечном итоге все сводится к стилю. Для меня есть привлекательная последовательность в использовании define
Когда все ваши функции сделаны с lambda
: Первый аргумент всегда является символом, а второй аргумент - это просто старое выражение. И тот факт, что lambda
так же, как любое старое выражение - одна из самых важных вещей для любого функционального программиста, который должен учиться.
Вы можете увидеть, что ваша схема расширяет эти ярлыки (макросы) на использование expand
(Если поддерживается):
Mzscheme 4.2.4 (с Drscheme):
> (expand '(define (add1 x) (+ 1 x)))
#<syntax (define-values (add1) (lambda...>
(define-values
(add1)
(lambda (x) (apply + '1 x)))
CHEZ SHAGE 8.0:
> (expand '(define (add1 x) (+ 1 x)))
(begin
(set! add1
(lambda (x)
(+ 1 x)))
(void))
А lambda
кажется простым как день.
Я смутно помню, как профессор обсуждал что -то подобное.
Я думаю, что решение Lambda используется по двум причинам:
Первое - это чисто историческая вещь. В какой -то момент это был единственный способ, которым это было возможно. Так что некоторые люди все еще используют этот метод.
Во -вторых, некоторые люди просто любят быть более явными в отношении того факта, что создается функция, поэтому им нравится видеть слово лямбда.
Поэтому я верю, что выбор сводится к тому, что вам лично нравится лучшее.
Я немного читаю о исчислении Lambda (чтение «реализация языков функционального программирования» Саймона Пейтона Джонса; бесплатный PDF онлайн), когда я использую TLS. И так это просто предположение, но я считаю, что авторы TLS хотят, чтобы вы действительно были тяжелыми в своем мышлении. Они не выходят и не говорят это, но есть подсказки (проверьте стр. 107 TLS), что это просто упражнение в Applied Lambda Calc. Так что, может быть, они говорят, не говоря: «Вы делаете абстракции Lambda, мой друг!»
Маленькая схема использует схему псевдокода (для облегчения для образовательных целей и для того, чтобы быть независимым от реализации). Сегодняшняя стандартная схема имеет определение определения, в котором вы неявно вызывает лямбду (см. http://www.cs.cmu.edu/groups/ai/html/r4rs/r4rs_7.html) Маленькая схема схемы очень проста и не включает эту альтернативную форму.