Как применить анонимную функцию из списка в схеме? - PullRequest
6 голосов
/ 03 июня 2009

Я учу Схему. Что не так с кодом ниже? Я хочу написать программу, которая берет первую функцию из списка и затем применяет ее к числу?

    (define num  3)

    ;;I want to do something like this which returns 3
    ((λ (x) x)num)

    ;;but my functions are in a list so this should return3
    ((first '((λ (x) x) (λ (x) (* x x)))) num)

Я получаю эту ошибку для приведенного выше кода:
применение процедуры: ожидаемая процедура, учитывая: (λ (x) x); аргументы были: 3

Что это значит, когда я получаю такие результаты?

Когда я ничего не применяю, я получаю хороший вывод.

(first '((λ(x) x)(λ(x) (*x x))))

возвращает (λ (x) x)

Ответы [ 3 ]

11 голосов
/ 03 июня 2009

Вы цитируете лямбду, поэтому она не оценивается.

Если вы просто введете (λ (x) x) в приглашении, DrScheme покажет вам #<procedure>, что означает, что он действительно оценил лямбду и вернул закрытие. Цитируя это, вы даете Схеме просто список символов.

Если вы хотите поместить свои функции в список, вы можете сделать:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num)

Цитата позволяет вам составить список, да, но список которого не оценивается. Функция list создает список из всех своих аргументов после их оценки.

Вы также можете поставить кавычки в списке, если хотите:

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num)
2 голосов
/ 07 июля 2011

(лямбда (х) х) не процедура. Это форма, которая оценивает в процедуре. Люди немного свободны в терминологии и часто называют лямбда-форму процедурой как своего рода стенографию. «Ceci n'est pasne pipe».

2 голосов
/ 11 июня 2009

В чем разница между этими выражениями?

> (procedure? (lambda (n) n))
#t
> (procedure? (quote (lambda (n) n)))
#f
> (procedure? '(lambda (n) n))
#f

Джей ответил за тебя, но я пока не могу его проголосовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...