明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 532|回复: 3

[提问] type用法有什么要求么?

[复制链接]
发表于 2025-1-23 06:47:08 | 显示全部楼层 |阅读模式
本想用type来判断是否为函数还是符号,结果与想法不一样呢?
(setq l '((cons 1 2)))
(equal (type (car (car l))) 'subr);nil
没找到原因,一查看
命令: (setq l '((cons 1 2)))
((cons 1 2))
命令: (type (car (car l)))
SYM
命令: (type cons)
SUBR
命令: (setq a (car (car l)))
cons
"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 2025-1-23 08:49:11 | 显示全部楼层
(setq l(list(list cons 1 2)))
((#<SUBR @11e66258 CONS> 1 2))
_$ (type (car (car l)))
SUBR
_$ l
((#<SUBR @11e66258 CONS> 1 2))
_$ (eval(car l))
(1 . 2)
_$ (setq l '((cons 1 2)))
((CONS 1 2))
_$ (eval(car l))
(1 . 2)

把函数弄到表里边,确实有时些莫名其妙的
回复 支持 反对

使用道具 举报

发表于 2025-1-23 09:08:00 | 显示全部楼层
你把(setq l '((cons 1 2)))写成这样(setq l (list (list cons 1 2)))试试
你的写法相当于(setq l (list (list 'cons 1 2))),cons变成是一个符号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-24 06:42:41 | 显示全部楼层
ssyfeng 发表于 2025-1-23 09:08
你把(setq l '((cons 1 2)))写成这样(setq l (list (list cons 1 2)))试试
你的写法相当于(setq l (list ( ...

这里的l的来源不受控,
也就是说可能是(setq l '((cons 1 2)))
也可能是(setq l (list (list cons 1 2)))
遇上后者判断成功,若遇前者判断失误。

给我的感觉是quote函数及type函数不太靠得住,
最后我放弃用type函数,用eval函数好象比较可靠。

命令: (setq l '((cons 1 2)))
((CONS 1 2))
命令: (type (car (car l)))
SYM
命令: (setq l '((cons 1 2)))
((CONS 1 2))
命令: (setq ll (list (list cons 1 2)))
((#<SUBR @0000000029a4ff70 CONS> 1 2))
命令: (equal (substr (vl-princ-to-string (eval (car (car l)))) 1 6) "#<SUBR")
T
命令: (equal (substr (vl-princ-to-string (eval (car (car ll)))) 1 6) "#<SUBR")
T
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-1 02:05 , Processed in 0.151286 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表