2014-03-06 71 views
7

在菲爾Hagelberg的(technomancygripes file他指出以下有關Clojure的:有沒有一種快速的方法來檢查Clojure函數中的零參數?

nil is everywhere and causes bugs that are difficult to find the source

現在菲爾是個聰明的傢伙誰貢獻了很多Clojure的社會,每個人都使用他的東西 - 所以我認爲這是值得琢磨一會兒。

一個簡單的方法來管理零參數傳遞給一個函數是拋出一個錯誤:

(defn myfunc [myarg1] 
    (when (nil? myarg1) 
    (throw (Exception. "nil arg for myfunc"))) 
    (prn "done!")) 

這兩每樣板的說法臭氣多餘的線條。是否有通過元數據或宏刪除它們的慣用方法?

我的問題是有沒有一種快速的方法來檢查Clojure函數中的零參數?

回答

6

有這些情況一的Clojure語言基礎的解決方案: http://clojure.org/special_forms#toc10

(defn constrained-sqr [x] 
    {:pre [(pos? x)] 
    :post [(> % 16), (< % 225)]} 
    (* x x)) 

適應您的要求:

(defn constrained-fn [ x] 
    {:pre [(not (nil? x))]} 
    x) 
(constrained-fn nil) 
=> AssertionError Assert failed: (not (nil? x)) ...../constrained-fn (form-init550343637.clj:1) 

而且裏面還有@fogus的contrib庫core.contracts,一更復雜的工具

更多資訊此頁面http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

+3

當clojure 1.6出現時,你可以替換(not(nil? x))一些? – DanLebrero

+0

@dAni看來你是對的,因爲我可以閱讀的clojure 1.6變化https://github.com/clojure/clojure/blob/master/changes.md#23-new-some-operations – tangrammer

+0

'{:pre [ (不是(nil?x))]}'可以簡化爲{:pre [x]}' – marathon

相關問題