所有的,我開始看看Clojure語言,並且對我正在嘗試做的事情有幾個問題。廣泛的目標是將序列功能every?
別名至all?
。我確定有一個函數或者宏可以混合(或者沿着這些線),但是我想看看到目前爲止我所知道的一些基本構造是否可行。我的方法是定義一個名爲all?
的函數,它將參數應用於every?
實現。我很好奇,看看這是否可以不可知,所以我想參數我的別名函數採取兩個參數,新名稱(作爲關鍵字)和舊名稱(作爲函數參考)。爲了實現這一目標,我遇到了兩個問題。Clojure元編程問題(適合初學者!)
1)使用關鍵字定義命名函數會引發錯誤。顯然它想要clojure.lang.IObj
。
user=> (defn :foo "bar")
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:0)
有蒙上了關鍵字到IObj,或其他手段來參數與一些提供價值新定義的函數的名稱的功能? (在Ruby,define_method除其他技術執行此)
irb(main)> self.class.instance_eval do
irb(main)* define_method(:foo) { "bar" }
irb(main)> end
=> #<Proc>
irb(main)> foo
=> "bar"
2)收集所有參數的函數成一個單一的變量。即使是基本功能,如(+ 1 2 3 4)
也會帶來可變數量的參數。到目前爲止,我所見過的所有函數定義技術都需要一定數量的參數,但沒有辦法將列表中的所有內容都彙總在函數體中進行處理。再次,我要做的是在紅寶石這樣做:
irb(main)> def foo(*args)
irb(main)> p args
irb(main)> end
=> nil
irb(main)> foo(1, 2, 3)
[1, 2, 3]
=> nil
感謝您的任何幫助,您可以提供我!
剛剛發佈了一個帶有「intern-alias」功能的Gist,實現了最後一段中暗示的設計。我會在一秒鐘內添加一個文檔字符串。它將原始元素複製到別名,支持在除當前名稱空間以外的名稱空間中創建別名,同時接受符號和變量作爲原始&c。見http://gist.github.com/464970 – 2010-07-06 03:55:17
來吧,夥計。至少給別人一個機會!是否有某種藥物可以降低智力水平回到正常水平?回到我們身邊,兄弟,我們想念你。 :p – Rayne 2010-07-06 09:48:51
感謝您的深入評論。它絕對照亮了我所尋找的大部分。關於第3點(變量是用符號命名的,而不是關鍵字),有沒有辦法將關鍵字變成符號?比如說,爲了練習,我想寫一個包裝def的函數,並且帶了兩個參數,一個關鍵字和一個值,然後在內部調用def並將變量命名爲關鍵字的名稱。可能? – 2010-07-06 22:23:13