LINUX.ORG.RU

Как в Лиспе вызвать функцию по имени?


0

0

Нашел кучу способов, вертящихся вокруг, да около, но ни один не подходит. Например, я могу написать (function foo) или (symbol-function 'foo) а потом передать это в funcall. А мне нужно из строки, т.е. (тарам-парам "foo"). Пробовал intern, но он возвращает |move|, которым funcall плюется. Что делать?

★★

В Питоне такое делается eval(). Что, в Лиспе не так?

tailgunner ★★★★★
()
Ответ на: комментарий от marsijanin

Ну, а теперь вызови Ѧ, используя строку "Ѧ".

xTERM ★★
() автор топика

[1]> (defun foo () t)
FOO
[2]> (funcall (symbol-function (intern "foo")))

*** - SYMBOL-FUNCTION: undefined function |foo|
The following restarts are available:
USE-VALUE      :R1      You may input a value to be used instead of (FDEFINITION '|foo|).
RETRY          :R2      Retry
STORE-VALUE    :R3      You may input a new value for (FDEFINITION '|foo|).
ABORT          :R4      ABORT
Break 1 [3]> abort
[4]> (funcall (symbol-function (intern "FOO")))
T

Miguel ★★★★★
()

CL-USER> (defun asdf (x) (+ x x))
ASDF
CL-USER> (find-symbol "asdf")
NIL
NIL
CL-USER> (find-symbol "ASDF")
ASDF
:INTERNAL
CL-USER> (funcall (symbol-function (find-symbol "ASDF")) 1)
2

mo3r
()
Ответ на: комментарий от xTERM

(funcall (symbol-function (find-symbol (string-upcase "foo"))))

:)

xTERM ★★
() автор топика

(defmacro funcall-by-string (name &rest args)
  `(funcall (intern (string-upcase ,name)) ,@args))

stassats ★★★★
()

Так вот теперь сиди и слушай Он не желал ей зла Он не хотел запасть ей в душу И тем лишить ее сна Он приносил по выходным ей сладости Читал в ее ладонях линии И он не знал на свете больше радости Чем в Лиспе функции вызывать по имени

anonymous
()
Ответ на: комментарий от mo3r

> CL-USER> (funcall (symbol-function (find-symbol "ASDF")) 1)

я что-то непонимаю, если для тупого вызова функции нужно столько кода написать то на кой оно нужно? помниться когда нам в универе lisp давали было все просто, что-то вроде:
defun f (x) (+ x x)
f (1)

но там был не common lisp, а какой-то другой диалект.

cobold ★★★★★
()
Ответ на: комментарий от cobold

Не выспался что-ли ? Человек спросил как в Лиспе вызвать функцию по имени. Функции в Лиспе привязаны к символам, символы разложены по пакетам. FIND-SYMBOL находит символ по имени, SYMBOL-FUNCTION берет функцию из символа, FUNCALL вызывает функцию. Еще можно использовать INTERN, но он создаст новый символ, если не обнаружит уже имеющийся, что не есть Тру.

Кстати, для Лиспа f(1) - сомнительный синтаксис. Скорее вам давали (f 1).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.