aws 发表于 2025-2-22 10:56:49

'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))
至于为什么打印出来,引号消失了,就当作是隐藏了吧,本质上还是符号
说起来,我之前一直没找到列表转置的使用场景,结果今天刚好写个代码,需要用到它,便有了此贴





aws 发表于 2025-2-27 08:18:33

月下闲人 发表于 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:10:48

本帖最后由 e2002 于 2025-2-24 14:13 编辑

你再阅读几遍 quote ,setq ,set 这几个函数的帮助文档,然后你就不需要再问这个问题了。

而且实际上并不需要这么复杂的来写这个语句。

aws 发表于 2025-2-24 14:32:25

e2002 发表于 2025-2-24 14:10
你再阅读几遍 quote ,setq ,set 这几个函数的帮助文档,然后你就不需要再问这个问题了。

而且实际上并 ...

还有比(apply 'mapcar(cons 'list lst))更简洁的?

baitang36 发表于 2025-2-24 15:25:50

本帖最后由 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是这个函数。

月下闲人 发表于 2025-2-26 22:25:00

感谢分享很强大   不过曲线相交就无法生成发像下面这种情况

月下闲人 发表于 2025-2-27 21:31:41

aws 发表于 2025-2-27 08:18
因为没考虑到这个情况,所以遗漏了一个相交判定,把这句替换了就行了

可以了
页: [1]
查看完整版本: 'list 是个啥