2012-01-03 17 views
7

aktaran ve sorun bu iki ifade arasındaki farkı anlamak yaşıyorum: Ben unquote olmadan onları çalıştırdığınızdaClojure - korkunç belirsiz başlığı :)</p> <p>Ben makrolarında yeni olduğum için üzgünüm Confusion

`(+ 1 2 ~(+ 2 3)) ; => (clojure.core/+ 1 2 5) 
'(+ 1 2 ~(+ 2 3)) ; => (+ 1 2 (clojure.core/unquote (+ 2 3))) 

Nitelikli olmaktan çok benzerler.

`(+ 1 2 (+ 2 3)) ; => (clojure.core/+ 1 2 (clojure.core/+ 2 3)) 
'(+ 1 2 (+ 2 3)) ; => (+ 1 2 (+ 2 3)) 

Temelde 'vs' ile karıştırıldım. Anlayışım, her ikisinin de listedeki her şeyi sıraya koymasıdır, bu yüzden neden unquote'un farklı davrandığından emin değilim. Temel olarak 'hem' hem de 'davranmasını beklediğim şekilde davranır.

Teşekkürler!

cevap

10

Kısa cevap, kapatmanın yalnızca bir backquote içinde çalıştığıdır. Normal alıntılanmış bir ifadede, ~ ve içerideki/arkadaki her şey dahil edildi gibi - her şey bir sonraki ifade içinde iken, ~'un içinde/arkasında bulunan her şey değerlendirilir (ancak diğer her şey tekrar değerlendirilmez). Yani, hayır, bir arkaplanlanmış ifadenin içindeki her şey değerlendirilmemiş kalır - ~ ile "boşlukları doldurun" bir şablon olarak kullanmak için, içinde ~ kullanabilirsiniz.

Düzenleme: alıntı için (cinas amaçlanan) documentation ilgili sorunuza:

Alıntı:

Quote (') 
'form => (quote form) 

ve (special forms bölümünden):

(alıntı formu) Değersiz form verir.

user=> '(a b c) 
(a b c) 

Not fonksiyonu a çağırmak için yapılan hiçbir girişim yoktur. dönüş değeri 3 sembolün bir listesidir. (Ayrıca quasiquote denir, Backquote)

sözdizimi-alıntı: Listeleriniz için

/Vektörler/Takımları/Haritalar, sözdizimi tırnak ilgili veri yapısı bir şablon oluşturur. Şablon içinde, nitelenmemiş formları, yinelemeli olarak sözdizimi alıntılanmış gibi davranır, ancak formlar, bildirgesinde veya açık seçime ekleme ile nitelenerek, bu yinelemeli alıntıdan muaf tutulan olabilir ve bu durumda, ifadeleri olarak değerlendirilir ve Şablon, değerlerine veya değer sıralamasına göre sırasıyla .

+1

unquoting verir Bawden] (http://www.scribd.com/doc/47702904/Bawden-Quasi-Quotation-in-Lisp). – Daimrod

+0

Daimrod, evet, bağlantı için teşekkürler! (Yeni başlayanlar için not: Diğer Lisp lehçeleri ve Clojure arasında birkaç fark vardır. Örneğin, CL'de ve kağıda, ', (Clojure'deki beyaz boşluk), dizilemede kullanılır. Ayrıca, CL, a', 'dışında backquoted ifade geçersiz (genellikle bir okuyucu hatası).) – danlei

+0

Teşekkürler, unquoting sözdizimi alıntı için ayrılmış olduğunu bilmiyordum. Bu kesinlikle sonuçları açıklıyor. Clojure'nin Joy'undan geçiyorum ve bu bölümü denemek ve denemek için Makro bölümünde duraklattım, bu yüzden mümkün olan bölümü bölümdeki açıklamaları kaçırdım :) – anonymous

4

İlk iki ifadenizin sonuçları üzerinde eval çalıştırmayı deneyin. Birincisi, güzel bir şekilde değerlendiren (+ 1 2 3)'a "," genişler "ile" genişler ". İkincisi,", "ile" genişler "(+ 1 2 (unquote (+ 1 2)))'a genişler ve bu metinde artık alıntı yapmadığınız için mektubu o bağlamda geçerli değildir! Yani bu tamamen değerlendirmek için tamamen başarısız.

Temelde ` 'arasında iki fark vardır:

  • ` ad-nitelendirir herşey
  • `Ayrıca Alan tarafından Lisp büyük bir kağıt [Yarı Fiyatlandırmamızı söz verebilir