Здравствуйте!
пишу такое:
(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)
Lisp, анонимные функции (почему не работает)
Модератор: Модераторы разделов
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: 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, анонимные функции
А 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, анонимные функции
И ещё добавлю.
В funcall тоже ничего «необычного» нет: он унаследован многими интерпретируемыми языками и называется там, как правило, eval.
В funcall тоже ничего «необычного» нет: он унаследован многими интерпретируемыми языками и называется там, как правило, eval.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Lisp, анонимные функции
Как раз-таки почти нигде это не допустимо. А в Common Lisp это можно, поэтому под значение и под «значение-функцию» выделены разные слоты символа. set и прочие setq устанавливают слот-значение, а fset — слот-значение-функцию.
Если уж сопоставлять, то setq<->fset и defvar<->defun.
Нет, Тихон. В Common List есть eval, который такой же, как и в прочих языках. А funcall практически нигде нет, т.к. нет отдельного слота для хранения значения-функции. См. например, Scheme или более близкий тебе elisp, там вообще первый элемент sexp сам может быть sexp: ((lambda (x) (+ x 1)) 1) => 2, а в CL так нельзя.
Хм-м… С Common Lisp или с Emacs Lisp? Те проблемы, что Вы описали, характерны именно для CL, в Elisp их нет.
Мои розовые очки