Ortak Lisp'de bir dizeyi argüman olarak alan ve bir anahtar kelime döndüren bir işlev var mı?Common Lisp Programatik Anahtar Kelime
Örnek: (keyword "foo")
->:foo
Ortak Lisp'de bir dizeyi argüman olarak alan ve bir anahtar kelime döndüren bir işlev var mı?Common Lisp Programatik Anahtar Kelime
Örnek: (keyword "foo")
->:foo
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")))
(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.
adı ihtiyacı bir anahtar kelime için "KEYWORD" paketinde staj edilecek. ör. (intern "FOO" "KEYWORD") –
ah evet. (Stajyer "foo" "KEYWORD") oldukça iyi çalışıyor. Teşekkür ederim. – nathan
Cevabımda, keyifle kullanabileceğiniz küçük bir işleve dönüştürdüm. :-) –
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")))
Tabii ki OP sadece baskı kutusu": downcase "olarak ayarlanmış olabilir… –
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
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 '.) –
:
(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
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. –
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
@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. –
@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. ** "* –