common-lisp - 用于 case 宏的 Defparameter 和相等谓词
问题描述
我有一些使用 defparameter 创建的整数类型的全局变量。我在 CASE 子句中使用这些作为键来匹配 test-key,在我的程序中的某个时刻,它被设置为这些全局变量之一。
据我所知, CASE 宏使用 EQL ( http://clhs.lisp.se/Body/26_glo_s.htm#same ),但我没有得到匹配:所有内容都被转储到 else 子句中。下面的代码总结了令我困惑的地方。
- (defparameter snafu 123) => SNAFU
- (let ((x snafu)) (and (eq x snafu) (eql x snafu) (equal x snafu))) => T
- (let ((x snafu)) (case x (snafu 'yes) (t'no))) => NO
- (let ((x snafu)) (cond ((eql x snafu) 'yes) (t 'no))) => YES
我不明白为什么我在 CASE 中没有得到 YES。
解决方案
不评估 case 子句,它们是按字面意思理解的。这个:
(case x
(snafu 'yes)
(t 'no))
相当于:
(if (eql x 'snafu) 'yes 'no)
snafu
请注意:之前的引号x
与符号snafu
而不是其值进行比较。
推荐阅读
- virtualbox - Two host only networks do not see each other. Why?
- python - 如何在正确的 if 语句之前打印第 X 行
- javascript - 在 JavaScript 中创建“运行循环”的最佳解决方案
- php - Laravel: Too few arguments to function App\Status::create(), 1 passed and exactly 2 expected
- php - Laravel: Images will not load up on virtual server
- binary - Binary numbers addition
- javascript - Is it possible to add a div to an element horizontally using javascript?
- angularjs - angularjs - 与日期格式混淆
- opencv - Hadoop 无法加载 opencv 本机库
- c# - 达到限制时在所有线程上停止 Parallel.For 吗?