首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >普通Lisp中的素数宏(SBCL)

普通Lisp中的素数宏(SBCL)
EN

Stack Overflow用户
提问于 2016-06-25 11:29:46
回答 1查看 141关注 0票数 1

下面是我编写的一个宏,用于测试一个数字的原始性:

代码语言:javascript
运行
复制
(defmacro primep (num)
  `(not (or ,@(loop for p in *primes* collecting `(= (mod ,num ,p) 0)))))

*primes*是一个动态变量,它包含迄今生成的素数列表(上下文是“下一个素数生成器”函数)。以下是几个早期编辑语句的结果:

代码语言:javascript
运行
复制
(let ((*primes* (list 2 3)))
  (primep 6))
-> T

(let ((*primes* (list 2 3)))
  (macroexpand-1 '(primep 6))
-> (NOT (OR (= (MOD 6 2) 0) (= (MOD 6 3) 0)))
-> T

(NOT (OR (= (MOD 6 2) 0) (= (MOD 6 3) 0)))
-> NIL

怎么一回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-25 11:45:02

您应该为此使用一个函数。宏用于生成代码。这里的问题是,用于*PRIMES**PRIMES*绑定是在运行时进行的,而不是在宏扩展过程中发生的。

您的代码作为一个函数应该是这样的。

代码语言:javascript
运行
复制
(defparameter *primes* (list))

(defun primep (num)
  (not (loop for p in *primes* thereis (zerop (mod num p)))))

(let ((*primes* (list 2 3)))
  (primep 6))
;=> NIL

(let ((*primes* (list 2 3)))
  (primep 7))
;=> T
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38028002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档