Clojure'da Yorumları Engelle


119

Clojure'da birden çok satırı nasıl yorumlayabilirim?

Yanıtlar:


145

Aslında bir yol var!


(comment

(defn hey [] ("Hey there!"))

Check me out! )

Yorumlarınızı (yorum ..) :)

İyi eğlenceler!


4
Kimliğin # || # 'i özlediğini düşündüm ama bu çok daha iyi.
unj2

4
Umarım Clojure ile eğleniyorsundur. :)
Rayne

14
Bir uyarı: bir (yorum ...) içindeki her şeyin uygun bir form olması gerekiyor gibi görünüyor; örneğin (comment merlo: world) iyi ama (comment merlo: world) bir istisna veriyor. [Düzenleme:] Görünüşe göre bu yorumu göndermeden önce Greg Hewgill'in cevabını okumalıydım ... peki, yine de birisi benim yaptığım şeyi yaparsa diye bırakacağım.
paul

19
Bir uyarı kelimesi - (yorum) makrosu sıfıra genişler. Tek bir forma yorum yapmak için #_ veya sıfır eklemeden birden çok forma yorum yapmak için #_ (yorum ...) kullanın.
modlarınıza iyi davranın

Bana şu makroyu hatırlıyor: stackoverflow.com/questions/3732173/…
Felipe

100

Clojure #_, sonraki formu tamamen atlayan bir okuyucu makrosunu destekler . Bu Clojure Reader hakkında sayfada belirtilmiştir . Orada da açıklama makro benzer bir etkiye sahiptir, fakat farklı uygulanmıştır.

Yukarıdakilerin her ikisi de, yorum yaptığınız şeyin, aksi halde sözdizimsel olarak doğru bir S-ifadesi olmasını gerektirir.

Bazı Lisp lehçelerinin rastgele metin içerebilen çok satırlı bir yorumu vardır, ancak Clojure için bir yorum göremiyorum.


20
Clojure çok satırlı rastgele metin yorum formu mevcut değildir. # | ...... | # yorum ekleyen bir yama gönderdim, ancak istenen bir özellik olmadığı için reddedildi. Bu nedenle, yakın zamanda eklenmesi pek olası değildir.
amalloy

5
@amalloy: Gerekçe neydi? Sadece gerekli değil mi yoksa bir itiraz var mıydı?
Ted

2
Okuryazar programlama stilini taklit ederek genellikle uzun yorumlar yazarım. Çok satırlı açıklamaları yeniden akıtmak için emacs kullanıyorum ( *scratch*arabellekte, sadece birkaç satırdan sonra ; ;;veya ;;;birden fazla önemsiz yazın , imleci noktalı virgüllerden sonraki ilk sözcüğe getirin ve tuşuna basın Meta-Q).
Reb.Cabin

25

Çift tırnak (dize değişmez) rastgele metin eklemeye izin verir (yalnızca uygun S formları değil):

(comment "

public class HelloWorld {
    public static void main(String[] args) {
        System.out.print("Hello, World");
        System.out.println();
    }
}

")

4
benim için çalışan güzel numara! Ama "Merhaba Dünya" daki alıntıların kaçılmasına gerek olmaması nasıl mümkün olabilir?
2

6
Bu sadece şans. Ivan'ın örneği 4 forma ayrıştırıyor: İlk biçim bir dizedir, ikinci biçim semboldür Hello, üçüncü biçim semboldür Worldve dördüncü biçim başka bir dizedir. commentsadece tüm formları görmezden geliyor. Bu yüzden, örnekte Hello, Worldyasal gizlenme olarak ayrıştırılan şanslıyız . Keyfi metinlerle çalışmaz. Örneğin (comment "print("/foo")"), hata ile ölecek Invalid token: /foo.
John Wiseman

17

Diğer örnekler harika, sadece bir numara daha eklemek istiyorum:

Bazen birkaç satır kod hakkında yorum yapmak istersiniz, ancak yine de derleyicinin onu derlemesini ve herhangi bir hatayı rapor etmesini istersiniz (örneğin, daha sonra REPL'de yürütmeyi planladığınız üst düzey bir ad alanında bir dizi komut).

Bu durumda kodu sarmaktan hoşlanıyorum, bu da kodun (fn [] .....)hala derlendiği anlamına geliyor, sadece çağrılmıyor.



9

Emacs ve cider M-x comment-regionkullanırken, sıklıkla kullandığım bir komut var.


2

Emacs'ta komutu M-;(kısayolu M-x comment-dwim) kullanabilirsiniz. Metnin / kodun işaretli herhangi bir bölgesini yorumlayacak veya açıklamasını kaldıracaktır, böylece tüm işleviniz veya işlevler setiniz bölgeye dahil olduğu sürece, o bölgeye kolayca yorum yapabilir veya açıklamayı kaldırabilirsiniz. İşleve ilişkin Emacs başvuru kılavuzu buradaM-; bulunabilir .


2

Bildiğim birçok yol var:

İlki kullanıyor açıklama makro: sadece gelmez değil comment vücudun içinde tüm kodu değerlendirir (ama dengeli parantez / parantez için hala çekler). Paredit ile yolunuzu biliyorsanız, birkaç sexp çağrısına yorum yapmak istiyorsanız fazla zaman almayacaktır.

(comment 
 (println 1))

Ancak yine de parantez eşleşmesini kontrol edecektir. Dolayısıyla, dengesiz paranteziniz varsa, kodunuz derlenmez (sonuç verir java.lang.RuntimeException: EOF while reading).

Başka bir yol kullanmaktır #_(aka atma makrosu): bir sonraki sexp'i atar, ki bu kişisel olarak tercih ettiğim yöntemdir (yazmak için daha hızlıdır ve normalde hata ayıklamam gerektiğinde bunu sexps üzerinde yaparım):

#_(println 1)

Aynı zamanda eşleşmeyen sınırlayıcıları da denetler: yani eğer dengesiz paranteziniz varsa, o da derlenmez.

Son olarak, ;satırı yorumlayacak karakter var (diğer dillerin yorum özelliğine benzer) ve derleme onu tamamen yok sayacak. Birden fazla satırı yorumlamak istiyorsanız, tüm satırların başına; , bu normalde bir güçlüktür, ancak genellikle metin editörleri bunu birden fazla satırı seçtikten sonra bir komutla sizin için yapar.

;  (println 1)
;  (println 1 also won't break

0

Uzun bir yorum bloğu için, Makrolar #_ veya (yorum ...) uygun şekilde çalışmadı, sonra VSCODE (OS X) ile yorum bloğu yaptım.

  1. Yorum bloğunu vurgulayın.
  2. vscode'da command + shift + p tuşlarına basın.
  3. "Satır Yorumu Ekle" yi bulun
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.