Değişkenleri bir listeye eklemeden önce nasıl değerlendiririm?


30

Aşağıdaki açıkçası işe yaramaz ve bu nedenle bu soru.

Nasıl değeri böylece aşağıdaki kodu düzeltirim somelistolur '(("abc" . 123))?

(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))

5
Quasiquoting'i denediniz mi? Dene `(,x . ,y).
Dan

Ah, özlediğim şey bu. Ne için google bilmiyordum :). Denedim (add-to-list 'somelist '(,x . ,y))ama backquote'yi unuttum.
Kaushal Modi

Bunun bir kopyası olarak kabul edilen sorular çok sık yineleniyor. Birisi yeni başlayanlar için bu soruyu / cevabını aradıkları şeyin ne olduğunu daha açık bir şekilde ortaya çıkarabilir mi? Sorunun bir kısmının bu sorunun başlığının yalnızca sorunun nedenini önceden biliyorsanız (yani cevabı biraz biliyorsanız) bir anlam ifade ettiğini düşünüyorum. Kendimi, değişkenlerin değerlendirilmesi gerektiği ve hatta "alıntı" nın ne anlama geldiği konusunda daha az fikir sahibi olmaları gerektiği konusunda hiçbir fikri olmayan bir kullanıcı olarak hayal etmeye çalışıyorum ama boş çıkıyorum. @Drew?
Stefan

@stefan: Bir hata mesajının (topluluğun Q + A'nın soru başlığında kullanılabildiği) olduğu durumdan farklı olarak, varsa, değerlendirilmesi gereken bir şeyden alıntı yapmaktan kaynaklanan hata (ve bu belirli bir sorundur) Bu durumda) alıntı yapılan yerin çok uzağında olabilir. Daha yaygın olarak, (Emacs) hatası yoktur - sadece kullanıcının istediklerine karşılık gelmeyen davranış.
Drew,

@Stefan: Bunun için akla mükemmel bir soru gelmiyor. Ama en azından doğrudan ele alan bir soruyu, belki de sadece bir alıntı işaretini ve ara verme talebini gerektiren bir davayı kaldırmayı gerektiren "normal" bir durum da dahil olmak üzere formüle edebiliriz. Bu tür davaları kapsayan iyi bir soru ve onları kapsayan iyi bir cevap yararlı olacaktır. Ancak yinelenen Q'ları bulmak için: Q başlığında bir hata mesajı olmadan tüm soruyu okumayı ve yinelemenin nasıl işaret edileceğini bilmeyi gerektirir.
Drew

Yanıtlar:


30

Genel sorun, yerleştirilmeden önce değerlendirilmeniz xve ihtiyaç duymanızdır . Alıntılanan listedeki sorun ( okuyucu sözdizimi ile birlikte ) bu , tartışmasını değerlendirmeyen özel bir formdur. Dokümanlara göre:ysomelist'quote

(quote ARG)

Değerlendirmeden, argümanı döndür. (quote x)verim x. Uyarı: quotedönüş değerini oluşturmaz, sadece Lisp okuyucusu tarafından önceden oluşturulmuş değeri verir ...

Bu nedenle, ya yeniden sorgulamanız ya da argümanları değerlendiren bir işlevi kullanmanız gerekir .

Geri alma, geri alınan bir listenin öğelerini ,sözdizimiyle seçici bir şekilde değerlendirmenize olanak sağlar :

(setq x "x-val" y "y-val" z "z-val" somelist nil)
'(x  y z)                            ; => (x y z)
`(x ,y z)                            ; => (x "y-val" z)
(add-to-list 'somelist `(x y ,z))    ; => ((x y "z-val"))

Alternatif olarak, cons(@tarsius'un cevabında önerdiği gibi) veya isteğe bağlı sayıda öğe için kullanabilirsiniz list:

(add-to-list 'somelist (cons x y))   ; => (("x-val" . "y-val"))
(setq somelist nil)                  ; reset
(add-to-list 'somelist (list x y z)) ; => (("x-val" "y-val" "z-val"))

Hangisini kullanacağınız, elementlerle yapmanız gerekenlere bağlıdır.


19

Alıntı ifadeleri değerlendirilmediğinden, eksilerini alıntılama. İşte tam olarak bu yüzden alıntı yapmak - değerlendirmeyi önlemek. Ama istediğin bu değil, o yüzden yapma.

Bunun yerine, değerlendirilen iki değerden bağımsız değişkenler içeren bir cons hücre oluşturan formu kullanın.

(cons x y)

Tabii ki, aynı zamanda quasiquote olabilir, ancak bu burada gerçekten mantıklı değil ve daha kötü görünüyor. Sadece `ve ,okunabilirliği arttırdığı zaman kullanın , yani bir cons hücresi oluşturmaktan veya varolan bazı listenin başına bir atom veya liste eklemekten daha karmaşık bir şey yaparken.

Quasiquoting kullanarak şöyle görünür:

`(,x . ,y)

Daha da kötüsü, çünkü bu durumda hiç gerekmeyen ek sözdizimini ve conskullanılmakta olan gizliliği kullanıyor.


3
consİng iyi nokta . Quasiquoting, beni okunaklılıktan ziyade liste içeriğinin hassas bir şekilde kontrol edilmesi konusunda daha fazla vurur, ancak kullanım durumunun mantıklı olduğu konusunda hemfikirim cons.
Dan

Cevabınız için teşekkür ederim. Bu benim için harika bir TIL anıydı. Körce listeleri ve eksileri önce alıntılar yapıyordum.
Kaushal Modi

@Dan, iyi evet - ve hayır. Sadece ile yapamayacağını şey yapamaz Quasiquoting cons, listve nconc. Daha güzel olmak dışında. “Listenin içeriğinin ince taneli kontrolüne” ihtiyacınız olduğunda yararlıdır (“başında bir atom veya liste eklemekten daha karmaşık bir şey yapmakta olduğu gibi”). Ve bu sözdizimsel şekeri kullanmanın ek faydası: okunabilirlik. Quasiquoting size daha fazla hassas kontrol sağlamaz - aynı şeyi ilk denemede daha az hatayla yapmanızı sağlar. :-)
tarsius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.