2008-10-17 24 views

cevap

31

Burada, anahtar kelime oluşturma işlemini (paketinin içine bir ad girilmesi) (intern paketi) paketleyen bir make-keyword işlevi yer almaktadır. :-)

(defun make-keyword (name) (values (intern name "KEYWORD"))) 
+0

Neredeyse, ama pek de değil. Bir anahtar kelime oluşturduğunuzda, değerini kendi kendine bağladığınızdan emin olmanız gerekir. – Vatine

+0

@Vatine Sadece test etmek için SBCL'm var ve SBCL'de, '(sembol değeri (staj "FOO" "KEYWORD")) 'zaten doğru değere sahip. Ayrıca, İskenderiye aynı yaklaşımı kullanarak da uygular. –

+9

@Vatine [11.1.2.3.1 KEYWORD Paketinde Sembol İçeren] (http://www.lispworks.com/documentation/HyperSpec/Body/11_abca.htm) diyor (vurgu eklenmiştir), * "KEYWORD paketi Bir sembolün içinde yer alması durumunda, özel paketler diğer paketlerden farklı olarak ele alınır.Özel olarak, bir sembol KEYWORD paketinde tutulduğunda, otomatik olarak bir harici sembol haline getirilir ve ** otomatik olarak bir sabit bir değişkenin kendisi ile bir değer. ** "* –

-5
(intern "foo" "KEYWORD") -> :foo 

diğer dize/simge dönüşüm ve semboller ve paketlerin detaylı tartışma için Common Lisp Cookbook ait Strings section bakınız.

+3

adı ihtiyacı bir anahtar kelime için "KEYWORD" paketinde staj edilecek. ör. (intern "FOO" "KEYWORD") –

+0

ah evet. (Stajyer "foo" "KEYWORD") oldukça iyi çalışıyor. Teşekkür ederim. – nathan

+0

Cevabımda, keyifle kullanabileceğiniz küçük bir işleve dönüştürdüm. :-) –

35

Kabaca doğru olarak verilirken verilen yanıtlar, sorunun örneğine doğru bir çözüm üretmez.

düşünün:

CL-USER(4): (intern "foo" :keyword) 

:|foo| 
NIL 
CL-USER(5): (eq * :foo) 

NIL 

Genellikle bunu staj önce dizeye İP-upcase uygulamak istediğiniz, böylece:

(defun make-keyword (name) (values (intern (string-upcase name) "KEYWORD"))) 
+1

Tabii ki OP sadece baskı kutusu": downcase "olarak ayarlanmış olabilir… –

2

Alexandria kütüphanede bir make-keyword işlevi vardır, öyle olsa Tam olarak ne istediğinizi elde etmek için davayı koruyun, önce dizgiyi dizmek zorunda kalacaksınız. o da (noktayla yerleştirme) boşluklarla dizeleri ile ilgilenen Bu örnekte

+0

Ya da' print-case' '' downcase' olarak ayarlayın. 'intern' herhangi bir durum değişikliği yapmaz, bu yüzden buradaki çözüm muhtemelen de olmamalıdır. (Sorudaki örnekte "(" foo ") =": foo "ifadesi bulunsa da, muhtemelen" (... "foo") =>: | foo | 'veya' (... " FOO ") =>: FOO '.) –

1

:

(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword))) 
+1

Boşlukları noktalarla değiştirmek istediğiniz bir sebep var mı? Eğer "foo çubuğu" nu çalıştırırsanız, "foo bar" adıyla bir sembol elde edersiniz ve bununla ilgili bir problem yoktur. 'intern', boşluklarla yer değiştirmez. –