Вопрос

Узнав немного схемы от 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? находятся defineD на верхнем уровне. Это означает, что это возможно и еще более компактно создать функцию с 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) Маленькая схема схемы очень проста и не включает эту альтернативную форму.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top