簡體   English   中英

在Clojure中建立匿名功能的地圖

[英]Constructing a map on anonymous function in Clojure

我只是在學習語言,並且有一個簡單的問題。 為什么這樣做(構造{:key "value"} ):

(#(assoc {} :key %) "value")

但這不是:

(#({:key %}) "value")
ArityException Wrong number of args (0) passed to: PersistentArrayMap  clojure.lang.AFn.throwArity (AFn.java:429)

在Python上,后一種語法完全有效:

> (lambda v: {'key': v})('value')
{'key': 'value'}

編輯:感謝出色的答案,很明顯,我需要停止思考#等同於Python中的lambda

讀者將#(f %)擴展為(fn [%] (f %) 。同樣, #({:key %})擴展為(fn [%] ({:key %}) 。等效的python其中一個是lambda v: {'key': v}() ,它與Clojure版本具有完全相同的問題。

您正在尋找的東西等同於(fn [v] {:key v}) 如果您真的想使用#(...)表示法,則可以使用#(do {:key %})

順便說一句,我個人從不使用#(...) 我認為更難理解(例如該證據的示例),並且僅比等效的fn格式緊湊得多。 然后還有一個限制,即不能嵌套#(...)形式。

那是#()閱讀器的局限性。 fn會正常工作。

user=> ((fn [x] {:key x}) "value")
{:key "value"}

請看一下文檔匿名函數文字(#())

{:key %}是一個PersistentArrayMap。 您可以將其放在函數調用的“動詞位置”中。 如您在第一個(有效的)示例中所看到的,您需要在那里使用某種Clojure方法來避免該錯誤。

暫無
暫無

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

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