2010-09-22 22 views
5

Por ejemplo, que paso por el nombre de la función a otra función¿Cómo se puede desactivar una función dentro de un defun?

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

y lo que quiero hacer es

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

Sin embargo, se dijo que no puedo defun con un símbolo ... ¿Qué ¿deberia hacer?

+0

defun no evalúa el nombre, el arglist o el cuerpo. todos tienen que ser valores literales. Entonces tu código tiene dos problemas.1) definirá una función func-name. 2) un aristócrata citado tampoco hará lo que usted espera. –

Respuesta

3

Uso

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

crear una nueva función con

(compile nil (list 'lambda args body)) 

donde args y el cuerpo tienen valores significativos.

+0

No puedo entender: qué usar, setf o compilar, o alguna combinación de ambos (¿cómo se ve entonces?). En realidad, no proporcionó un ejemplo de definición de función dentro de otra definición de función en el espíritu de ejemplo de la publicación original. –

+0

@Artem Pelenitsyn: Primero crearía el objeto de función y luego le ajustaría la función de símbolo. –

1

Se puede usar un lambda

http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-21.html

Si usted está tratando de hacer una nueva función globalmente accesibles dentro de una función, no creo que la gramática de la lengua permite. Si crea un lambda, puede inicializar una variable a este valor lambda y pasar la variable a sus funciones. En Common LISP, puede llamar (functionp x) para determinar si una variable es una función antes de intentar llamarla.

+0

muchas gracias. Sin embargo, mi intérprete me dice que definir no es una función ... "Error: intento de llamar a' DEFINE 'que es una función no definida. " – Frost

+0

¿está utilizando Common LISP? ¿Esquema? –

+0

Estoy usando Common LISP ~ – Frost

2

Resolver la siguiente manera:

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) 

Anteriormente también tenían el mismo problema cuando he definido la función.

Ejemplo:

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

Después corro

(test-function 'aaafunction) 

El resultado de la evaluación es

FN 

No devuelve una función llamada "aaafunction" ...

Para el perso n que rechazó mi respuesta: Somos novatos de Lisp, pero estamos trabajando duro para aprender, y usted no es tan respetuoso.

+0

'defun' devuelve el nombre de la función, no la función: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_defun.html – Ken

+0

defun no evalúa el nombre –

+0

Entonces, ¿cómo ¿Lo forzo a evaluar este "fn"? –

0

Utilizo defmacros para la metaprogramación, por ejemplo, this emacs lisp example.

0

Usar una macro será una buena opción. como (defmacro personal-function (nombre-func) `(defun, func-name '(attr1 attr2 ...) (dosificación))) inténtelo, espero que eso lo ayude.

Cuestiones relacionadas