簡體   English   中英

Clojure:如何執行一系列函數?

[英]Clojure: How to execute a sequence of functions?

我有一系列函數(改變一些對象)我想執行,如果我這樣做,它可以工作:

(foo1)
(foo2)
(foo3)

但是,我想把這段代碼放在一個函數中,這樣我就可以隨時執行這個序列。 如果我這樣做:

(defn run-foos [] (do (foo1) (foo2) (foo3)))

run-foos創建的突變與之前的3個單獨語句不同。 我很抱歉,我不能在這里簡明地總結我的程序的行為,但基本上我看到上面代碼的第一個和第二個版本之間存在一些行為差異。

我想要做的是有一個函數run-foos ,它將執行foo1foo2foo3 ,其運行方式與我連續單獨調用每個函數一樣。 我怎樣才能做到這一點?

沒有看到你的其余代碼,這里的差異並不明顯(一般來說兩者是相同的)。

你擁有的兩段代碼之間應該有任何區別的唯一原因是,如果在repl中輸入第一個代碼,並且foo1foo2返回了某種類型的惰性結果。 在這種情況下,repl會在打印時強制執行惰性結果,而run-foos不會。

如果那是你的問題,那么最好繼續使用run-foos但重構你的其他功能,這樣它們就不會混合副作用和懶惰。

此變體僅適用於可變數據。

(defn run-foos [] (do (foo1) (foo2) (foo3)))

但標准的clojure數據結構是不可變的。 因此,每當您的數據獨立地通過函數時,函數將使用默認數據,其中沒有函數的變異。 此外, run-foos將僅從最后一次表達返回數據,即(foo3)。

«除了最后一個表達式之外的所有值都會被丟棄,盡管它們的副作用確實會發生。»(Emerick,Carper,Grand:Clojure programming,2012)

我認為你需要線程宏:

(-> data
    foo1
    foo2
    foo3)

它在編譯時擴展為(foo3 (foo2 (foo1 data))) 數據將傳遞給鏈中的功能,您將得到您想要的。

在這里閱讀->宏示例: https//clojuredocs.org/clojure.core/-%3E

暫無
暫無

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

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