Tümü, Clojure diline bir göz atmaya başladım ve yapmaya çalıştığım bir şey hakkında birkaç soru sordum. Geniş amaç, every?
dizi fonksiyonunu all?
'a taklit etmektir. Eminim, takma isim yapan bir işlev ya da makro (ya da bu satırlardaki bir şey) var, ama şimdiye kadar bildiğim temel yapıların bir kısmının mümkün olup olmadığını görmek istedim. Benim yaklaşımım, argümanlarını every?
uygulamasına uygulayan all?
adlı bir işlevi tanımlamak olacaktı.Clojure Metagramgram Oluşturma (yeni başlayanlar için!)
Bunun agnostik yapılıp yapılmayacağını merak ediyorum, bu yüzden iki argüman, yeni ad (bir Anahtar Kelime olarak) ve eski ad (bir işlev referansı olarak) almak için takma ad işlevimi parametrelemek istedim. Bu hedefe ulaşmak için iki sorunla karşılaştım.
1) Anahtar sözcüklerle adlandırılmış işlevlerin tanımlanması hataları atar. Görünüşe göre clojure.lang.IObj
istiyor.
user=> (defn :foo "bar")
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:0)
bir mesafede bir değer ile yeni tanımlanan fonksiyonun adı parameterize bir IObj veya başka yollarla bir Anahtar döküm için bir işlevi var mı? tek bir değişken bir işleve tüm bağımsız değişkenler toplamak)
irb(main)> self.class.instance_eval do
irb(main)* define_method(:foo) { "bar" }
irb(main)> end
=> #<Proc>
irb(main)> foo
=> "bar"
2 (Ruby, diğer teknikler arasında define_method yapar). (+ 1 2 3 4)
gibi temel işlevler bile değişken miktarda argüman alır. Şimdiye kadar gördüğüm tüm fonksiyon tanımlama teknikleri, işlev gövdesinde işlem yapmak için her şeyi bir liste halinde toplamanın hiçbir yolu olmadan, belirli bir miktarda argüman alır. Bir kez daha, Ruby'ye şu şekilde devam ediyorum:
irb(main)> def foo(*args)
irb(main)> p args
irb(main)> end
=> nil
irb(main)> foo(1, 2, 3)
[1, 2, 3]
=> nil
Bana sağlayabileceğiniz herhangi bir yardım için teşekkürler!
Sadece son paragrafta ima edilen tasarımı gerçekleştiren 'intern-alias' işlevine sahip bir Gist yayınladı. Bir saniyede bir docstring ekleyeceğim. Bu meta, orijinalden takma adaya kopyalar, mevcut adın dışındaki ad alanlarındaki takma adlar oluşturmayı destekler, her iki sembolü de kabul eder ve Vars aslı olarak kabul eder & c. Bkz. Http://gist.github.com/464970 –
Hadi, ahbap. En azından başkalarına bir şans ver! Zeka seviyesini * normal * 'e düşürmek için alabileceğiniz bir çeşit ilaç yok mu? Bize geri dön kardeşim, seni özlüyoruz. : p – Rayne
Derin yorum için teşekkürler. Kesinlikle aradığım şeylerin çoğunu aydınlattı. # 3 numaralı noktaya ilişkin olarak (vars, anahtar kelimeler değil sembollerle adlandırılır), bir anahtar kelimeyi sembol haline getirmenin bir yolu var mıdır? Diyelim ki, bir egzersiz yapmak için, def'i sarmış bir fonksiyon yazmak istedim ve iki argüman, bir anahtar kelime ve bir değer aldım ve daha sonra dahili olarak def denir ve değişkene anahtar kelimenin ismini koydu. Mümkün? –