2017-03-26 5 views
1

Je voudrais définir des alias en lisp commun (clisp pour être exact) pour les commandes qui sont beaucoup utilisées, comme "defun" et "lambda" etc, est-ce possible?fonction lisp commune/alias de macro

C'est en fait une sorte de double de ce question, mais je ne peux pas commenter et la solution ne fonctionne pas pour defun ou lambda dans les deux sbcl et Clisp

Répondre

5

macros:

CL-USER 5 > (setf (macro-function 'dm) (macro-function 'defmethod)) 
#<Function DEFMETHOD 410009A014> 

CL-USER 6 > (dm m1+ ((v vector)) (map 'vector #'1+ v)) 
#<STANDARD-METHOD M1+ NIL (VECTOR) 4130003913> 

CL-USER 7 > (m1+ #(1 2 3 4)) 
#(2 3 4 5) 
3

Le point entier par des macros est de fournir une source de réécriture services .. Ainsi, je veux vous donner cela et vous pouvez faire que sortir:

(defmacro df (name (&rest arguments) &body body) 
    `(defun ,name ,arguments ,@body)) 

(df test (x) (+ x x)) 
(test 5) ; ==> 10 

Nous venons de raccourcir le nom .. permet de faire un autre:

(defmacro df1 (name &body body) 
    `(defun ,name (_) ,@body)) 

(df1 test (+ _ _)) 
(test 5) ; ==> 10 

Et ainsi de suite ...

+1

L'utilisation de '': seul est [Non défini selon la norme] (http://www.lispworks.com/documentation/HyperSpec/ Body/02_ce.htm). Il semble que ABCL, CLisp et ECL l'acceptent comme un symbole dont le nom est '" "'; ACL, CCL, LW et SBCL n'acceptent pas cette syntaxe. – acelent

+0

@acelent Il est logique que ':' soit spécial dans CL. J'ai choisi autre chose. – Sylwester

+0

C'est un peu plus compliqué que ce que je cherchais, car je dois encore comprendre la terminologie et les macros en général. Une idée de comment cela se traduirait par (un dialecte de) schéma? – DiiP