您可以通過將一些代碼重構爲單獨的函數來撤消控制流程中的節點;這將在C和Clojure中工作。
這是我的刺傷。手翻譯和未經測試,所以它可能是越野車。
(defn foo []
(let [foo2 (fn []
(if cond3 "something again")
(bar))]
(if somecondition
(do
"some code"
(if cond2
-1
(do
"some code again"
(foo2))))
(foo2))))
UPDATE一些解釋。
因爲ajay問,我想揭示一些導致我到上述解決方案的思想。
;快捷方式
c1 = somecondition
c2 = cond2
c3 = cond3
;真值表(幫我有點跟我的想法,但並沒有直接進入設計)
c1 c2 c3 results
----------------
T T . "some code" -1
T F T "some code" "some code again" "something again" bar()
T F F "some code" "some code again" bar()
F . T "something again" bar()
F . F bar()
方式Clojure的工作,有沒有「回報」。 Clojure函數總是返回最後一個要評估的表達式。如果我們想要產生相同的副作用(從「某些代碼」,「某些代碼再次」和「某事再次」),並導致C/Java代碼,我們需要使代碼運行的方式,結果真的是最後執行的事情。
能夠返回-1
的唯一方法是對代碼進行返工,以便從開始處的分支結束 - 確實結束於「-1」。這意味着必須從其他IF
分支之一中調用以下代碼。事實上,它出現在兩個分支。因此,爲了不必重複代碼,我將其拉入了自己的功能。
這裏是我的代碼的翻譯僞代碼:
功能foo2的:
if c3 then
"something again"
endif
bar()
函數foo:
if c1 then
"some code"
if c2 then
-1 <-- end 1
else
"some code again"
foo2 <-- end 2
endif
else
foo2 <-- end 3
endif
末1是你的棘手 「return -1
」。結尾2包括「some code again
」,結束3沒有。結束2和結束3測試C3,也許做「something again
」,然後return bar()
。
'((一些代碼)(如果(COND2)-1(some-代碼 - 再次)))'不起作用。Clojure的Parens總是意味着做一個函數調用。使用'when'並擺脫外面的parens。或者使用'do'。 – 2009-12-10 19:11:48
@ajay:我的答案按照承諾更新。 – 2009-12-10 20:08:17