Почему лямбда вместо сокращения определения функции считается хорошим стилем в схеме? - PullRequest
1 голос
/ 06 августа 2010

На схеме, почему это:

(define foo
  (lambda (x)
    42))

считается лучшим стилем, чем этот:

(define (foo x)
  42)

И есть ли причина отдавать предпочтение одному?

Ответы [ 4 ]

4 голосов
/ 06 августа 2010

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

0 голосов
/ 07 августа 2010

Это потому, что

(define (foo x)
   42)

добавляет специальную форму к языку.

1.

 (define foo 45)

Является ли одна специальная форма

2.

 (lambda (x) (+ x 1)

Является другой специальной формой, поэтому:

(define foo (lambda (x) (+ x 1)))

Добавлена ​​никакая другая специальная форма, кроме 2 выше.

Поэтому добавлено сокращение для определенияфункция является синтаксическим сахаром.Поскольку схема имеет тенденцию быть минималистской, нет необходимости в том, чтобы язык добавлял больше специальной формы, чем необходимо.Теперь я думаю, что:

(define foo (x) (+ x 1))

удобочитаем, и его не нужно тратить на запоминание и понимание, поэтому я не против иметь его в схеме.

0 голосов
/ 06 августа 2010

Если стиль - это другое слово для предпочтения, тогда я согласен, что первый - лучший стиль. В нем прямо сказано: «foo - это функция от x». Трудно ошибиться там. Аргумент для стиля defun в вашем втором примере заключается в том, что вы определяете его так, как вы его называете.

Это lisp-эквивалент того, куда вы ставите * при объявлении переменной-указателя в C. Ничего не значит: выберите либо то, что вам нравится, либо группу, с которой вы работаете, уже определились. Никто не поймет вас неправильно.

0 голосов
/ 06 августа 2010

То, что вы показываете, эквивалентно этому в Javascript:

var foo = function(x) {42;}

против

function foo(x) {
  42;
}

Последний является синтаксическим сахаром первого. Первый стиль - это общая форма, последний - это ярлык для определения функций.

Что касается стиля, я не знаю, почему предпочтение отдается первому. Это длиннее и требует больше вложенности.

...