Как определить функцию внутри функции defun? - PullRequest
5 голосов
/ 22 сентября 2010

Например, я передаю имя функции другой функции

(personal-function 'func-name '(attr1 attr2 ...))

, и я хочу сделать следующее:

(defun personal-function (func-name)
     (defun func-name '(attr1 attr2 ...) (dosomething)))

Однако там сказано, что я не могу defunс символом ... Что мне делать?

Ответы [ 5 ]

4 голосов
/ 22 сентября 2010

Использование

(setf (symbol-function my-symbol) some-function)

создать новую функцию с

(compile nil (list 'lambda args body))

, где аргументы и тело имеют значимые значения.

2 голосов
/ 22 сентября 2010

Решите это следующим образом:

e.g1

(defun create-function(a1)
  (defun plus-function(x) (+ x a1)))

(create-function 2) -> PLUS-FUNCTION
(plus-function 3) ->5

e.g2

(setf (symbol-function 'printx) #'(lambda (x) (print x)))

(printx '(1 2 3)) -> (1 2 3)

Ранее у меня также была такая же проблема, когда я определял функцию.

Пример:

(defun test-function(fn)
            (defun fn ((lambda() (print "aaa")))))

После того, как я бегу

(test-function 'aaafunction)

Результат оценки:

FN

Не возвращает функцию с именем "aaafunction" ...

Человеку, понизившему мой ответ: Мы новички в Лиспе, но мы усердно работаем над изучением знаний, а вы не так уважительны.

1 голос
/ 22 сентября 2010

Вы можете использовать лямбду

http://www.n -a-n-o.com / лепет / CMUCL-учебники / LISP-учебник-21.html

Если вы пытаетесь создать новую глобально доступную функцию внутри функции, я не думаю, что грамматика языка позволяет это сделать. Если вы создаете лямбду, вы можете инициализировать переменную с этим лямбда-значением и передать переменную своим функциям. В Common LISP вы можете вызвать (functionp x), чтобы определить, является ли переменная функцией, прежде чем пытаться ее вызвать.

0 голосов
/ 19 марта 2013

Использование макроса будет хорошим выбором. такие как (defmacro personal-function (func-name) `(defun, func-name '(attr1 attr2 ...) (dosomething))) пожалуйста, попробуйте, надеюсь, это поможет вам.

0 голосов
/ 22 сентября 2010

Я использую defmacros для метапрограммирования, например, это пример emacs lisp.

...