type用法有什么要求么?
本想用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 (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)
把函数弄到表里边,确实有时些莫名其妙的 你把(setq l '((cons 1 2)))写成这样(setq l (list (list cons 1 2)))试试
你的写法相当于(setq l (list (list 'cons 1 2))),cons变成是一个符号 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
页:
[1]