2012-04-21 80 views
1

我想寫一個宏,給定一個表單,將所有丟失的符號定義爲themselve。在Clojure中定義丟失的符號

現在我有以下幾點:

​​

cl這裏是clojure.core的別名) 我知道有可能是有副作用的問題,但在這裏,這並不重要(雖然解決方案無副作用的問題會更好)

如果有不止一人失蹤(不可分解)符號,我得到以下異常:

java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to clojure.lang.IDeref, compiling:(shen/primitives.clj:517) 

有什麼想法改變什麼?是否有一些「現成的」解決方案?

乾杯

回答

3

而不是使用try/catch來找到解決不了的符號,也許你可以使用現有的defmacro&env符號做一些事情。 &env的鍵是本地定義的符號。

Article about &env and &form.

使用的resolve組合和(keys &env)您可以隔離沒有定義的符號,那麼你可以選擇是變形點焊是(not (or (resolve sym) (contains? &env sym))

我們做一個類似於此的那些在Midje source code,以確定哪些以表格測試符號已經定義,哪些不是:

[注意:在下面的代碼locals實際上(keys &env)]

(defn- headings-rows+values [table locals] 
    (letfn [(table-variable? [s] 
      (and (symbol? s) 
       (not (metaconstant-symbol? s)) 
       (not (resolve s)) 
       (not (contains? locals s))))] 
    (split-with table-variable? (remove-pipes+where table)))) 
+0

'((set(keys&env))sym)'只是一個緩慢的寫法'(包含? &env sym)',對嗎?儘管如此,很酷的解決方案 - 似乎應該是顯而易見的,但我沒有想到它,所以我猜不是! – amalloy 2012-04-21 19:42:00

+0

是的,讓我編輯我的解決方案,用'contains?',這只是一個疏忽。 – 2012-04-21 19:46:29

+0

Midje鏈接404s。 – missingfaktor 2013-09-08 13:52:24