簡體   English   中英

Clojure中嵌套的匿名函數

[英]Nested anonymous functions in Clojure

嵌套匿名函數是否合法? 我為4clojure的問題#107寫了以下內容:

(fn [n] #(reduce * (repeat n %)))

它通過了所有3個測試,但是當我在repl中嘗試使用測試3時,我得到一個IllegalStateException,說不允許嵌套#():

IllegalStateException Nested #()s are not allowed  
clojure.lang.LispReader$FnReader.invoke (LispReader.java:628)

CompilerException java.lang.RuntimeException: Unable to resolve symbol: n 
in this context, compiling:(NO_SOURCE_PATH:1:44) 

RuntimeException Unmatched delimiter: )  

clojure.lang.Util.runtimeException (Util.java:221)

RuntimeException Unmatched delimiter: )  

clojure.lang.Util.runtimeException (Util.java:221)

CompilerException java.lang.RuntimeException: Unable to resolve symbol: % 
in this context, compiling:(NO_SOURCE_PATH:0:0) 

RuntimeException Unmatched delimiter: )  

clojure.lang.Util.runtimeException (Util.java:221)

RuntimeException Unmatched delimiter: )  

clojure.lang.Util.runtimeException (Util.java:221)

RuntimeException Unmatched delimiter: )  

clojure.lang.Util.runtimeException (Util.java:221)

RuntimeException Unmatched delimiter: )  

clojure.lang.Util.runtimeException (Util.java:221)

為什么這個不能通過repl而不是4clojure傳遞?

嵌套的匿名函數完全可以。 但你不能嵌套#()讀取器宏,因為它沒有很好地定義 - 我們無法知道%1程序員是指外部函數文字的第一個參數還是內部函數文字的第一個參數。

如果要評估整個測試表單,則需要輸出'longhand'(使用fn )的內部函數。

(fn [n]
  (fn [m] 
    (reduce * (repeat n m))))

在4Clojure上工作必須是因為他們在將其插入測試表單之前評估您提供的表單。 因此,在評估測試表單時,#()宏已經擴展(到fn* )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM