2013-06-22 30 views
7

Yaygın lisp'te, yuva adı/sembol kullanılarak yapı yuvasına erişmek için ne kullanabilirim? Benim istediğimcommon lisp: kenar yapıları için alan değeri

bu işleri cl ben clozure cl kullanarak ve clozure yılında ediyorum

(defstruct point (x 0) (y 0))  
(defmacro -> (struct slot) `(slot-value ,struct ,slot)) 

(setf p (make-point)) 
(setf (slot-value p 'x) 1) 
(setf (-> p 'y) 2) 

olduğunu. Ancak, AFAIK bu standart dışı davranıştır ("tanımlanmamış davranış" C++ ile eşdeğerdir). Başka bir CL uygulamasına geçmeyi planlamıyorum, bu yüzden yapılar için slot-value'u kullanmaya devam etmeli miyim, yoksa daha iyi bir yolu var mı?

cevap

8

Genellikle, erişim işlevlerini yapılarla kullanırsınız.

Kodunuz erişimci işlevleri point-x ve point-y tanımlar. Bunları kullanabilirsiniz.

Ayrıca bunu destekleyecek uygulamaları ile ilgili yapılarla SLOT-VALUE kullanabilirsiniz. Sanırım bu çoğu uygulama (GCL bir istisna olurdu). SLOT-VALUE'un yapılar için çalıştığını varsayan Lisp yazılımı var. Uygulamaların bunun için desteği kaldıracağını düşünmüyorum. Standartta değildir, çünkü bazı uygulamacılar bu işlevselliği dağıtılmış uygulamalarda sağlamak istemezler.

Her iki yol da tamamdır. Eğer erişimcilerle gidin kısa isimlere sahip olmak istiyorsanız

: Çeşitli erişimci fonksiyonları arasındaki

CL-USER 109 > (defstruct (point :conc-name) 
       (x 0) (y 0)) 
POINT 

CL-USER 110 > (make-point :x 5 :y 3) 
#S(POINT :X 5 :Y 3) 

CL-USER 111 > (setf p1 *) 
#S(POINT :X 5 :Y 3) 

CL-USER 112 > (x p1) 
5 

CL-USER 113 > (setf p2 (make-point :x 2 :y 3)) 
#S(POINT :X 2 :Y 3) 

CL-USER 114 > (list p1 p2) 
(#S(POINT :X 5 :Y 3) #S(POINT :X 2 :Y 3)) 

CL-USER 115 > (mapcar 'x (list p1 p2)) 
(5 2) 

İsim çatışmaları daha sonra bir paket tarafından engellenecektir gerekecekti. Eğer SLOT-VALUE daha kısa bir versiyonunu yazmak istiyorsanız

, o da iyi. Makro yaz. Veya satır içi bir işlev yazın. Tabii neden olmasın?

Dediğim gibi çoğu uygulamalarında yapılarla SLOT-VALUE çalışır. Bu durumda ANSI CL spesifikasyonunun bunu tanımlamamasına dikkat etmelisiniz. Birçok açıdan, uygulamalar ANSI CL spesifikasyonlarını genişletir. SLOT-VALUE, CLOS sınıflar olarak şartların uygulanmasındaki, CLOS sınıflar olarak akışları uygulanması, yapıların üzerinde çalışan bir Meta-nesne Protokolü sağlayarak Örneğin, ...

+0

"Bana o kullanabilir." Bunu biliyorum, ama C++ 'dan geliyor, bu uzun/verbose. C++/C'de "." Ile alanlara erişirsiniz. veya "->". Yani p noktası; p.x = 0; '. Bu yüzden daha kısa sözdizimi istedim. "->" makrosunu tanımladım ama "slot-değeri" nin yapılarda kullanılmasının gerekmediğini (birçok uygulamada çalışmasına rağmen) öğrendim. Bu yüzden soruyu sordum. – SigTerm

+0

Teşekkürler, bu oldukça yararlı/bilgilendirici oldu. – SigTerm