2016-03-27 20 views
3

Biz Defrost gibi bir makro nasıl tanımlanır?

(defstruct point 
    x 
    y) 

Sonra O Ama olarak "-p" ekleyebilirsiniz nasıl bir makro

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

tanımlamak kolay görünüyor point-p

bir işlev olsun

bu şekilde böyle bir yapıyı tanımlamak fun-name'da bir sonek mi? Ben

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

suffix gibi bir şey olabilir düşünüyorum bir işlev olabilir. Peki bunu nasıl uygulayabilirim?

+1

Tam olarak aynı değil, ama http://stackoverflow.com/q/24433035/1281433 sizin için bir cevabınız olabilir veya en azından bazı yararlı ipuçları olabilir. –

+0

@JoshuaTaylor Teşekkür ederim. – user6119377

cevap

5

Sembolünüzden bir ip yapmak için sadece string kullanın. Onunla ne isterseniz yapın ve tanımlayıcı olarak kullanabileceğiniz dahili bir sembol elde etmek için intern'u kullanın.

(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 

Not: Eğer zaten tırnaksız ifadesi içindeki virgül (unquote) kullanırken Eğer makro bir hata var.

+3

Dizeleri sonek olarak geçirmenin, okunabilir durumunun – PuercoPop

+1

@PuercoPop iyi yakalamasıyla değiştirilebileceğini unutmayın. – Sylwester

+2

dizgi-concat ortak lisp görünmüyor. Ben kullanıyorum: ('string ... vs) – kennytilton

İlgili konular