wrf610051 发表于 2025-1-23 06:47:08

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

llsheng_73 发表于 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)

把函数弄到表里边,确实有时些莫名其妙的

ssyfeng 发表于 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变成是一个符号

wrf610051 发表于 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
页: [1]
查看完整版本: type用法有什么要求么?