Я не понимаю, почему работает лямбда-схема - PullRequest
0 голосов
/ 08 декабря 2018

Я совершенно новичок в схеме, исходящий из ac # background.

Я думал, что получаю дескриптор лямбды, но я не понимаю, почему этот пример работает:

(let ([f (lambda x x)]) (f 1 2 3 4) )

Ответ (1 2 3 4), но как?Это часть xx , которую я не понимаю.Лямбда не принимает параметров, поэтому тело имеет значение xx , верно?Но я не знаю, что это значит в этом случае, кто-то может объяснить?Благодаря.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018
Синтаксис

A lambda выглядит следующим образом:

(lambda argument-list body ...)

Глядя на вашу лямбду:

(lambda x x)

Таким образом, список аргументов равен x, а тело лямбды -x.

Список в схеме выглядит как (a b c), но на самом деле это (a . (b . (c . ()))) и в списке аргументов процедуры, если цепочка заканчивается символом, например (a b . c), тогда процедура принимает 2 аргумента или больше .«Остальные» аргументы накапливаются в списке под названием c.В ES6 он такой же, как (a, b, ...c) => expression.Теперь, если у вас нет обязательных аргументов, например.Вы допускаете 0 или более аргументов, список аргументов является просто символом.например, (lambda x x) - это то же самое, что и (...x) => x.

. Я верю в C # вместо x, который можно было бы написать params type[] x.C # не использует анонимный аргумент lambda + rest, поэтому я надеюсь, что вы знаете ES6.

0 голосов
/ 08 декабря 2018

На самом деле lambda в вашем коде - это параметры получения и их число.Синтаксис для lambda без параметров отличается:

(let ([f (lambda () 1)]) (f))
=> 1

Выражение lambda в вопросе является чем-то другим:

(lambda x x)

Он получает переменное число аргументовв виде списка, а затем возвращает их.Вы назвали его f, и когда он вызывается так:

(f 1 2 3 4) 

Все аргументы привязываются к x, списку и затем к значению xвозвращается:

'(1 2 3 4)

Итак, f - это не что иное, как функция identity , которая получает несколько аргументов.Возможно, этот ответ прояснит, как различные функции определены на схеме.Для полноты, вот пример lambda, который получает single аргумент и возвращает его:

(let ([f (lambda (x) x)]) (f 1))
=> 1

Итак, у вас это есть, вот как мы определяем lambdas, которые получают 0, 1 или много параметров.

...