'list 是个啥
本帖最后由 aws 于 2025-2-22 10:56 编辑假设
(setq lst '((1 2 3)(4 5 6)(7 8 9)))
那么
(cons 'list lst)返回是个啥?
我原本以为返回的是
('list(1 2 3)(4 5 6)(7 8 9))
但实际上打印出来的是
(list(1 2 3)(4 5 6)(7 8 9))
为什么单引号没了?很奇怪,而且list不是函数吗,怎么会被打印出来?
这里纠结了很久,后来
(defun c:gg()
(print(type list))
(print(type 'list))
(print(type "list"))
(print(type 3.14))
(print(type 10))
(princ)
)
命令: GG
SUBR
SYM
STR
REAL
INT
直到我用这个函数去测试,发现了一个特殊的数据类型sym(Symbol),这个数据类型意思是符号。它既不是函数,也不是字符串,就是符号。
尽管它和函数长得很像,但它是一个独立的数据类型,mapcar 这个函数,后面跟着的就是符号或自定义函数
如此一来,便可理解了(cons 'list lst)这句代码
也便理解了列表转置
(apply 'mapcar(cons 'list lst))
至于为什么打印出来,引号消失了,就当作是隐藏了吧,本质上还是符号
说起来,我之前一直没找到列表转置的使用场景,结果今天刚好写个代码,需要用到它,便有了此贴
月下闲人 发表于 2025-2-26 22:25
感谢分享很强大 不过曲线相交就无法生成发像下面这种情况
(setq pts3(mapcar '(lambda(x1 x2 / dist mm pts4)
(if(equal x1 x2 0.1)
(progn
(setq pts4 nil)
(repeat n(setq pts4(cons x1 pts4)))
)
(progn
(setq dist(distance x1 x2))
(setq mm(/ dist(1+ n)))
(setq pts4 nil)
(while
(>(setq dist(- dist mm))0.1)
(setq pts4(cons(polar x1(angle x1 x2)dist)pts4))
)
)
)
)pts1 pts2))因为没考虑到这个情况,所以遗漏了一个相交判定,把这句替换了就行了 本帖最后由 e2002 于 2025-2-24 14:13 编辑
你再阅读几遍 quote ,setq ,set 这几个函数的帮助文档,然后你就不需要再问这个问题了。
而且实际上并不需要这么复杂的来写这个语句。 e2002 发表于 2025-2-24 14:10
你再阅读几遍 quote ,setq ,set 这几个函数的帮助文档,然后你就不需要再问这个问题了。
而且实际上并 ...
还有比(apply 'mapcar(cons 'list lst))更简洁的? 本帖最后由 baitang36 于 2025-2-24 15:29 编辑
命令: (setq lst '((1 2 3)(4 5 6)(7 8 9)))
((1 2 3) (4 5 6) (7 8 9))
命令: (cons 'list lst)
(LIST (1 2 3) (4 5 6) (7 8 9))
命令: !lst
((1 2 3) (4 5 6) (7 8 9))
命令: (apply 'mapcar(cons 'list lst))
((1 4 7) (2 5 8) (3 6 9))
变量名前加一撇,表示这个是个符号 (symbol),符号的名vl-symbol-name是个字符串,符号的值vl-symbol-value是这个函数。
感谢分享很强大 不过曲线相交就无法生成发像下面这种情况 aws 发表于 2025-2-27 08:18
因为没考虑到这个情况,所以遗漏了一个相交判定,把这句替换了就行了
可以了
页:
[1]