明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 879|回复: 8

[经验] 'list 是个啥

  [复制链接]
发表于 2025-2-22 10:56:49 | 显示全部楼层 |阅读模式
本帖最后由 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))
至于为什么打印出来,引号消失了,就当作是隐藏了吧,本质上还是符号

说起来,我之前一直没找到列表转置的使用场景,结果今天刚好写个代码,需要用到它,便有了此贴





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 4明经币 +4 金钱 +20 收起 理由
wzg356 + 1 很给力!
tigcat + 1 + 10 很给力!
kucha007 + 1 神马都是浮云
hhh454 + 1 + 10 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 2025-2-27 08:18:33 | 显示全部楼层
月下闲人 发表于 2025-2-26 22:25
感谢分享  很强大   不过曲线相交就无法生成发  像下面这种情况
  1.   (setq pts3(mapcar '(lambda(x1 x2 / dist mm pts4)
  2.                        (if(equal x1 x2 0.1)
  3.                          (progn
  4.                            (setq pts4 nil)
  5.                            (repeat n(setq pts4(cons x1 pts4)))
  6.                          )
  7.                          (progn
  8.                            (setq dist(distance x1 x2))
  9.                            (setq mm(/ dist(1+ n)))
  10.                            (setq pts4 nil)
  11.                            (while
  12.                              (>(setq dist(- dist mm))0.1)
  13.                              (setq pts4(cons(polar x1(angle x1 x2)dist)pts4))
  14.                            )
  15.                          )
  16.                        )
  17.                      )pts1 pts2))
因为没考虑到这个情况,所以遗漏了一个相交判定,把这句替换了就行了
回复 支持 1 反对 0

使用道具 举报

发表于 2025-2-24 14:10:48 | 显示全部楼层
本帖最后由 e2002 于 2025-2-24 14:13 编辑

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

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

使用道具 举报

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

而且实际上并 ...

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

点评

aws
如果不知道符号这个概念,确实很难明白,但是只要了解符号这个概念,这个代码也算是浅显易懂  发表于 2025-2-25 08:14
显然。 但很多时候并不是非要去追求“简洁”,一般情况下,代码应该是清晰、明确、易懂。  发表于 2025-2-24 22:17
回复 支持 反对

使用道具 举报

发表于 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 | 显示全部楼层
感谢分享  很强大   不过曲线相交就无法生成发  像下面这种情况

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-2-27 21:31:41 | 显示全部楼层
aws 发表于 2025-2-27 08:18
因为没考虑到这个情况,所以遗漏了一个相交判定,把这句替换了就行了

可以了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-2 18:42 , Processed in 0.305188 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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