我剛開始學習宏函數的概念。在lisp中創建與incf等效的宏函數
我的老師要求我們創建一個宏函數,其功能與incf
完全一樣。
這是他給了我們對流行
(defmacro mypop (nom)
(list 'prog1 (list 'car nom) (list 'setq nom (list 'cdr nom))))
這裏是我想變成一個宏觀的常規功能的例子:
(defun iincf (elem &optional num)
(cond
((not num) (setq elem (+ 1 elem)))
(t (setq elem (+ num elem)))))
這裏是我把它企圖成宏:
(defmacro myincf (elem &optional num)
(list 'cond
((list 'not num) (list 'setq elem (list '+ 1 elem)))
(t (list 'setq elem (list '+ num elem)))))
不過,我得到這個錯誤,我不知道爲什麼:
*** - system::%expand-form: (list 'not num) should be a lambda expression
另外,我不確定我的函數是否真的會改變頂層變量的值。
因此,這裏有我的2個問題:
- 爲什麼我得到這個錯誤?
- 函數我試圖變成宏罰款? (如果成功將它變成宏功能,它會按照我的意圖去做嗎?)
PS:我知道這個練習可能會違反lisp中的許多常用規則,但這僅僅是爲了練習。謝謝! :)
我只想告訴你關於[Portacle](https://github.com/Shinmera/portacle),一個便攜式和多平臺Common Lisp開發環境(運送Emacs,SBCL,Slime,Quicklips和Git),因爲它是獲取一個好的開發環境的最簡單的方法,我知道我很欣賞找到它:),也關於[lisp-lang.org](http://lisp-lang.org/),一個*吸引人的*和現代網站在CL上,如果你不認爲這可能存在(就像我一樣)! – Ehvince