有沒有一種方法可以在advace中不知道它的情況下輕鬆地引用另一個軟件包中的符號?在common-lisp編譯時未知的其他軟件包中的符號
比方說,我有這樣的包名以下MY-PACKAGE功能
(defun foo-bar (foo bar)
`((,foo . foo)
(,bar . bar)))
如果我撥打以上來自同一個包我會得到類似如下:
MY-PACKAGE> (foo-bar 1 2)
((FOO . 1) (BAR . 2))
如果我把它從其它的什麼包,假設CL-USER,符號返回指包MY-PACKAGE:
CL-USER> (my-package:foo-bar 1 2)
((MY-PACKAGE:FOO . 1) (MY-PACKAGE:BAR . 2))
有時,特別是在編寫宏時,我希望將函數返回符號插入調用該函數的包中(在本例中爲CL-USER)。 我已經能夠做到這一點的唯一方法是通過改寫富吧如下
(defun foo-bar (foo bar)
`((,(intern "FOO" *package*) . ,foo)
(,(intern "BAR" *package*) . ,bar)))
這很快變得難看,expecially當符號被賦予作爲參數。 有沒有更好的方法來處理這個問題?
符號包無關緊要的另一種選擇是使用STRING =作爲測試。 – Xach 2011-05-01 16:06:25
感謝您的回答Rainer。我知道我可以使用INTERN,但是我想知道它是否是唯一的選擇,或者是否可以以與我不同的方式完成。我不確定我能否使用無間斷符號,因爲在某些情況下,我需要比較它們的值。我可以使用關鍵字符號或簡單地導出我需要的符號,但它不是我想要的。我正在尋找一些與'loop'宏有關的東西,我可以在這裏寫出例如'(cl:loop for x upto 10 collect x)''不必使用':for'或'cl:for' – 2011-05-06 08:23:32
@Marco Righele:你可以簡單地替換符號。宏在某些包中獲取帶有符號內部的表達式。然後它可以用某種方式遍歷這個表達式,並用標準包中的符號替換特定的內部符號。通常LOOP宏的設計會導致在這些包中創建的符號不被視爲最好的主意。 – 2011-05-06 13:07:11