簡體   English   中英

clojure:如何在if語句中使用recur

[英]clojure: how to use recur in if statement

免責聲明:我正在學習Clojure。

這是我要運行的簡單示例:

(ns ClojureTest.core)

(let [input (read-line)]
  ;if user input = "x"
  (if (= "x" input)
    ;stop accepting input
    (println "Exit")
    ;else output the input and continue accepting input
    (
      (println input)
      (recur)
    )
  )
)

現在我遇到了這個錯誤,我認為這是有道理的,因為我不熟悉語法:

Exception in thread "main" java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(ClojureTest/core.clj:8:7)

我該如何解決?

附帶問題:

  1. 當我在Eclipse中單擊“運行”時(就像我對Java所做的那樣),不僅打開了控制台,而且看到了“ REPL”窗口。 為什么有必要,它有什么作用?
  2. 當我單擊“運行”時,需要花費很長時間才能啟動該應用程序。 有沒有辦法使其更快?
  3. 當我需要編輯代碼並重新啟動應用程序時,我收到以下消息:“選擇無法啟動,並且沒有近期啟動”。 那是什么,為什么它不讓我重新啟動代碼? 如果我稍等片刻,可以再次啟動它。

在這種特殊情況下,你錯過了一個do了的“其他”條款中if

(do
  (println input)
  (recur))

如果沒有do ,您將得到((println input) (recur)) ,它看起來像一個函數調用,其中(println input)的返回值是要調用的函數,而(recur)是參數表達式,因此,不是在尾巴位置。

(很明顯, (println input)將返回nil並嘗試將其作為函數調用將拋出NullPointerException ,但這在此無關緊要-這將是運行時錯誤,而可檢測到recur -not-in-tail-position問題在編譯時。)

暫無
暫無

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

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