2008-10-10 7 views
9

... como hacen los paquetes.¿Es posible tener un alias para el nombre de la función en Lisp?

utilizo Emacs (tal vez, puede ofrecer algún tipo de solución).

Por ejemplo (defun the-very-very-long-but-good-name() ...) no es útil más adelante en el código. Pero el nombre como Fn-15 o la primera abreviatura de letras tampoco es útil. ¿Es posible tener un alias como paquetes o acceder a la cadena de documentación al intentar recuperar el nombre de la función?

En otras palabras, ¿es posible que las funciones se mezclen de algún modo con nombres cortos y autodocumentados?

Respuesta

29

¿Quieres defalias. (defalias 'newname 'oldname) conservará la documentación e incluso mostrará "newname es un alias para` oldname '"cuando se solicite su documentación.

+0

Hm, cómo usarlo? no puedo encontrar en CL-USUARIO y otros ... – avp

+1

Ctrl- Hf defalias te llevará bien si necesitas ir. –

+1

Lo anterior debe ser (defalias 'newname' oldname). – gknauth

0

Si su problema es que no puede recordar un nombre de función muy largo, pero recuerda parte del nombre, para eso es "apropiado". En mi Emacs, tengo "C-h a" obligado a "hiperpropósito". Ingresa una subcadena del símbolo que está buscando y enumera todas las coincidencias.

+0

Mi problema es que Quiero dos nombres cortos y descripciones, creo. – avp

-1

simplemente podría tener una función que sólo llama a otra función.

+0

Perdería la documentación entonces. – leppie

0

No sé Emacs, pero ¿no (definir shortname longnamefunctionblahblah) funciona?

+0

Bueno ... Primero, no es automático. En segundo lugar, necesito preocuparme por mí mismo. Tercero, es torpe ... :( – avp

0

puede utilizar (defmacro ...) poner un alias para una función

+0

Repito lo que le he dicho a Leppie. Es solo ... No sé ... Se ve feo. Es decir, requiere esfuerzo, pero proporciona solo lectura. Abrev modo y hippie-expand hace trabajo similar sin esfuerzo ... Pero de todos modos, gracias por la entrada! – avp

3

Si es todo el tipado lo que hace indeseable el uso continuo de nombres largos, entonces sí, emacs puede ayudar. Consulte abbrev-mode. También bien pensado en este contexto es hippie-expand.

Si se trata de una cuestión de facilidad de lectura, eso es más difícil. ?

3

de "On Lisp" Aquí está el código:

(defmacro alias (new-name prev-name) 
    `(defmacro ,new-name (&rest args) 
    `(,',prev-name ,@args))) 

; use: (alias df defun) 


(defun group (source n) 
    (if (zerop n) (error "zero length")) 
    (labels ((rec (source acc) 
     (let ((rest (nthcdr n source))) 
      (if (consp rest) 
      (rec rest (cons (subseq source 0 n) acc)) 
      (nreverse (cons source acc)))))) 
    (if source (rec source nil) nil))) 

(defmacro aliasx (&rest names) 
    `(alias 
    ,@(mapcar #'(lambda (pair) 
      `(alias ,@pair)) 
      (group names 2)))) 

; use: (aliasx df1 defun 
;    df2 defun 
;    df3 defun) 
+0

Th anks, muyinliu, por aportes, pero Allen ya respondió la pregunta. OTOH, esta solución me obliga a recordar los detalles innecesarios, que preferiría evitar. – avp

3

Usted podría utilizar setf para asignar la función de la célula función de otro, por ejemplo:

(defmacro alias (new-name prev-name) 
    `(setf (symbol-function ,new-name) (symbol-function ,prev-name))) 
+1

Esto ni siquiera necesita ser un macro '(defun alias (nombre-previo-nombre nuevo) (setf (nombre-función-nombre-nuevo) (función-símbolo nombre-previo)))' también funciona. – Inaimathi

Cuestiones relacionadas