【发布时间】:2010-10-07 21:15:41
【问题描述】:
学习 Common Lisp(使用 GNU CLISP 2.43).. 所以可能是一个菜鸟错误。例子是'打印 x 和 y 之间的素数'
(defun is-prime (n)
(if (< n 2) (return-from is-prime NIL))
(do ((i 2 (1+ i)))
((= i n) T)
(if (= (mod n i) 0)
(return NIL))))
(defun next-prime-after (n)
(do ((i (1+ n) (1+ i)))
((is-prime i) i)))
(defmacro do-primes-v2 ((var start end) &body body)
`(do ((,var (if (is-prime ,start)
,start
(next-prime-after ,start))
(next-prime-after ,var)))
((> ,var ,end))
,@body))
(defmacro do-primes-v3 ((var start end) &body body)
(let ((loop-start (gensym))
(loop-end (gensym)))
`(do ((,loop-start ,start)
(,loop-end ,end)
(,var (if (is-prime ,loop-start)
,loop-start
(next-prime-after ,loop-start))
(next-prime-after ,var)))
((> ,var ,loop-end))
,@body )))
do-primes-v2 完美运行。
[13]> (do-primes-v2 (p 10 25) (格式 t "~d " p)) 11 13 17 19 23接下来我尝试使用 gensym 来避免宏扩展中的命名冲突 - do-primes-v3。但是我被困住了
*** - EVAL:变量 #:G3498 没有值尝试使用宏扩展来查看我是否可以发现错误,但我不能。
[16]> (macroexpand-1 `(do-primes-v3 (p 10 25) (格式 t "~d " p))) (做 ((#:G3502 10) (#:G3503 25) (P (IF (IS-PRIME #:G3502) #:G3502 (NEXT-PRIME-AFTER #:G3502)) (P)))) ((> P #:G3503)) (格式 T "~d " P)) ;【问题讨论】:
-
Lisp 似乎弄乱了 stackoverflow 的语法着色。
-
它是这样做的...尝试在行尾添加一个带有终止引号的注释以最大程度地减少影响
-
Gishu,反之亦然。使用 HTML pre 标签而不是 markdown 缩进来禁用语法高亮。
-
我发现这段代码中空格的使用令人困惑。我可以把它整理得更接近标准格式吗?
-
继续...我被引导相信这是 LISP 方式 :)
标签: lisp common-lisp