Lisp, анонимные функции (почему не работает)

Модератор: Модераторы разделов

adav84
Сообщения: 41

Lisp, анонимные функции

Сообщение adav84 »

Здравствуйте!
пишу такое:

(setq x (lambda (n) (+ n 3)))
(x 7) ; вываливается в отладчик

нашел в мануале про funcall:
(funcall x 7) ;=> 10

и про fset нашел:
(fset 'y x)
(y 7) ;=>10

а как бы так сделать, чтобы не юзать funcall и не заводить функцию с пом. fset ? можно ли как-то преобразовать symbol-value x в функцию "на лету"?

т.е. что-нибудь типа

((cast-variable-as-function x) 7) ;=> 10 ?


и вообще, почему в Lisp так строго? ведь в Javascript, к примеру, не пишут:
var x=function(n){...

funcall(x, 7); или
fset(y, x); y(7);

а просто x(7);, ведь по скобкам и так видно, что это как-бы функция - так же, как в (x 7) !

да, можно было изначально определить ф-ю с помощью defun, но меня интересует setq


(не бейте ногами, я пока просто играюсь с Lisp в *scratch*-буфере emacs)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Lisp, анонимные функции

Сообщение t.t »

adav84 писал(а):
22.01.2011 06:38
и вообще, почему в Lisp так строго?
В Lisp всё как и везде — допустимы переменные и функции с совпадающими именами. При этом setq задаёт переменную, а defun — функцию.

Код: Выделить всё

(setq x 1)
1
(defun x (n) (+ n 3))
x
(x x)
4
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Lisp, анонимные функции

Сообщение t.t »

А fset как раз «превращает» переменную в функцию. Вот Вам занимательный примерчик:

Код: Выделить всё

(setq x (lambda (n) (cons n 1)))
(lambda (n) (cons n 1))
(fset 'x x)
(lambda (n) (cons n 1))
(x x)
((lambda (n) (cons n 1)) . 1)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Lisp, анонимные функции

Сообщение t.t »

И ещё добавлю.

В funcall тоже ничего «необычного» нет: он унаследован многими интерпретируемыми языками и называется там, как правило, eval.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Lisp, анонимные функции

Сообщение watashiwa_daredeska »

t.t писал(а):
22.01.2011 11:46
В Lisp всё как и везде — допустимы переменные и функции с совпадающими именами.
Как раз-таки почти нигде это не допустимо. А в Common Lisp это можно, поэтому под значение и под «значение-функцию» выделены разные слоты символа. set и прочие setq устанавливают слот-значение, а fset — слот-значение-функцию.

t.t писал(а):
22.01.2011 11:46
При этом setq задаёт переменную, а defun — функцию.
Если уж сопоставлять, то setq<->fset и defvar<->defun.

t.t писал(а):
22.01.2011 12:12
В funcall тоже ничего «необычного» нет: он унаследован многими интерпретируемыми языками и называется там, как правило, eval.
Нет, Тихон. В Common List есть eval, который такой же, как и в прочих языках. А funcall практически нигде нет, т.к. нет отдельного слота для хранения значения-функции. См. например, Scheme или более близкий тебе elisp, там вообще первый элемент sexp сам может быть sexp: ((lambda (x) (+ x 1)) 1) => 2, а в CL так нельзя.

adav84 писал(а):
22.01.2011 06:38
я пока просто играюсь с Lisp в *scratch*-буфере emacs
Хм-м… С Common Lisp или с Emacs Lisp? Те проблемы, что Вы описали, характерны именно для CL, в Elisp их нет.
Спасибо сказали: