2016-03-27 11 views
3

Wir definieren eine Struktur wie auf diese WeiseWie definiert man ein Makro wie defstruct?

(defstruct point 
    x 
    y) 

Dann haben wir eine Funktion erhalten point-p

Es scheint einfach ein Makro

(defmacro mac (fun-name) 
    `(defun ,fun-name() 
    t)) 

Aber wie kann man definieren kann ich „-p“ hinzufügen, ein Suffix auf fun-name? Ich denke, es ist so etwas wie

(defmacro mac (fun-name) 
    `(defun ,(suffix ,fun-name)() 
    t)) 

suffix kann eine Funktion sein kann. Wie kann ich das tatsächlich umsetzen?

+1

Es ist nicht genau dasselbe, aber ich denke, dass http://Stackoverflow.com/q/24433035/1281433 eine Antwort für Sie haben kann, oder zumindest einige hilfreiche Tipps. –

+0

@JoshuaTaylor Danke. – user6119377

Antwort

5

Sie verwenden einfach string, um eine Zeichenfolge aus Ihrem Symbol zu machen. Tun Sie, was Sie wollen und intern es ein internes Symbol erhalten, das Sie als Bezeichner verwenden können.

(defun suffix (symbol suffix) 
    (intern (concatenate 'string (string symbol) (string suffix)))) 

(defmacro make-predicate (fun-name) 
    `(defun ,(suffix fun-name '#:-p)() 
    t)) 
(make-predicate test) 
(test-p) ; ==> t 

NB: Sie haben einen Fehler in Ihrem Makro, wie Sie das Komma (unquote) innerhalb eines bereits unquoted Ausdruck verwenden.

+3

Beachten Sie, dass das Übergeben von Zeichenfolgen als Suffix Probleme mit readtable haben wird, deren Fall – PuercoPop

+1

@PuercoPop good catch geändert wird. – Sylwester

+2

string-concat scheint nicht geläufig zu sein. Ich verwende: (verketten 'string ... etc) – kennytilton

Verwandte Themen