İşte hata ayıklama için kullandığım (Clojure'da):
user=> (defmacro print-var [varname] `(println ~(name varname) "=" ~varname))
#'user/print-var
=> (def x (reduce * [1 2 3 4 5]))
#'user/x
=> (print-var x)
x = 120
nil
C ++ 'ta elle haddelenmiş bir karma tabloyla uğraşmak zorunda kaldım, buradaki get
metot argüman olarak const olmayan bir dize başvurusu aldı; Başa çıkmayı kolaylaştırmak için aşağıdaki gibi bir şey yazdım:
#define LET(name, value, body) \
do { \
string name(value); \
body; \
assert(name == value); \
} while (false)
Bu tür bir sorunun lisp'te ortaya çıkması pek mümkün olmamakla birlikte, özellikle gerçek bir izin-bağlatarak , argümanlarını iki kez değerlendirmeyen makrolara sahip olmanız çok hoş . (Kabul ettim, işte bunun etrafında olabilirdi).
Ben de bir çirkin şeyleri kullanabilmeniz için çok çirkin bir hack paketine başvuruyorum do ... while (false)
ve hala beklendiği gibi başka bir parça çalışmasını yapıyorum. Buna lisan'da ihtiyacınız yoktur, bu karakter dizileri yerine sözdizimi ağaçlarında çalışan makroların bir işlevidir (ya da token dizileri, sanırım C ve C ++ durumunda) ve sonra ayrıştırma işlemine tabi tutulur.
Kodunuzu daha temiz bir şekilde okuyacak şekilde yeniden düzenlemek için kullanabileceğiniz birkaç yerleşik iş parçacığı makroları vardır (paralelliği değil, kodunuzu bir arada eklerken olduğu gibi 'iş parçacığı'). Örneğin:
(->> (range 6) (filter even?) (map inc) (reduce *))
İlk formu alır ve bir (range 6)
sonraki formun (filter even?)
son argümanı olan sonraki formun son argümanını oluşturur, böylece yukarıdakiler yeniden yazılır.
(reduce * (map inc (filter even? (range 6))))
Sanırım ilk önce çok daha net bir şekilde okuyor: "bu verileri al, bunu yap, sonra bunu yap, sonra diğerini yap ve biz bittik", ama bu öznel; nesnel olarak doğru olan bir şey, işlemleri gerçekleştirildikleri sırayla okumanızdır (tembellikten yoksun).
Ayrıca önceki formu ilk (son değil) argüman olarak ekleyen bir değişken de vardır. Bir kullanım durumu aritmetik:
(-> 17 (- 2) (/ 3))
"17 almak, 2 çıkarmak ve 3 ile bölmek" olarak okuyor.
Aritmetikten bahsedersek, notasyon ayrıştırmayı düzenleyen bir makro yazabilir, böylece örneğin söyleyebildiğiniz (infix (17 - 2) / 3)
ve (/ (- 17 2) 3)
daha az okunabilir olmanın dezavantajının ve geçerli bir lisp ifadesi olmanın avantajının tükürdüğünü söyleyebilirsiniz . Bu DSL / veri alt dilinin bir kısmı.