我寫了這個快速排序功能:是否有可能在lisp中將遞歸函數重寫爲宏?
(defun quicksort (lst)
(if (null lst)
nil
(let ((div (car lst))
(tail (cdr lst)))
(append (quicksort (remove-if-not (lambda (x) (< x div)) tail))
(list div)
(quicksort (remove-if (lambda (x) (< x div)) tail))))))
,但我不能把它改寫爲宏,它不工作,也沒有,例如,這個簡單的FOO(遞歸總和 - 我知道,有點傻,但正如爲例):
(defun Suma (lst)
(if (cdr lst)
(+ (Suma (cdr lst))
(car lst))
(car lst)))
正常工作,但宏:
(defmacro SumaMacro (lst)
'(if (cdr lst)
'(+ (prog (SUMAMACRO (cdr lst)))
(prog (car lst)))
'(car lst)))
似乎是錯誤的。有人有任何關於重寫遞歸函數的建議嗎?
對不起,但我冒昧地將提問者的代碼格式化爲標準的Lisp風格。 – Svante 2010-01-20 21:35:18
我認爲最好讓它看起來有所不同。 ;-) – 2010-01-20 21:36:59
有點挑剔:在第一段中,不應該是「宏觀擴展時間」而不是「編譯時間」嗎? – Svante 2010-01-21 19:25:37