aws 发表于 2024-6-26 11:35:46

ssdel和ssadd和cons、subst使用区别

(ssdel en ss);---修改直接生效,不需要重新定义ss

(ssadd en ss);---修改直接生效,不需要重新定义ss

(cons p pts);---修改不直接生效,需要套一层,重新定义pts
;---测试一
(defun c:gg1()
(setq ss(ssget))
(setq en(ssname ss 0))
(ssdel en ss)
(princ(sslength ss))
(princ)
)
;---测试二
(defun c:gg2()
(setq ss(ssget))
(setq en(ssname ss 0))
(setq s(ssadd))
(ssadd en s)
(princ(sslength s))
(princ)
)
;---测试三
(defun c:gg3()
(setq p '(0 0)pts nil)
;(cons p pts)
(setq pts(cons p pts))
(princ pts)
(princ)
)最近遇到一个问题,就是ssdel和ssadd和cons这三个函数,都是修改数据的,他们的使用规则居然不太一样。为什么呀?另外,还有其他类似函数吗?
subst函数好像也算,他也需要套一层,重新定义一下。是不是表的操作都需要重新定义,其他数据类型就不需要?

tryhi 发表于 2024-6-26 11:48:56

本帖最后由 tryhi 于 2024-6-26 11:52 编辑

cons跟subst并不是修改数据,它们是有返回值的,lsp基本上靠返回值(楼主知道什么是返回值吗?),能直接修改数据的,似乎就没几个,选择集算一个,vla-GetBoundingBox函数能直接修改第二、第三参数的值,还有set,还有吗?想不起来,再就是保留函数string-elt<-

aws 发表于 2024-6-26 11:52:50

tryhi 发表于 2024-6-26 11:48
lsp基本上靠返回值,能直接修改数据的,似乎就没几个,选择集算一个,vla-GetBoundingBox函数能直接修改第 ...

嘿嘿,如果都是套一层,倒也习惯了,关键就是每次我用ssdel和ssadd的时候,总是犹豫要不要套一层,犹豫徘徊。

你有种再说一遍 发表于 2024-6-26 14:13:40

本帖最后由 你有种再说一遍 于 2024-6-26 15:31 编辑

因为你不知道什么是数据结构,什么是lisp的数据结构...
cons的底层大概率是一个链表+游离指针实现的(堆也可以,不过按照lisp的尿性不是),所以它比Add快,至于为什么不是数组,大概率是因为压根就没想过lisp怎么实现加速.
lisp缺少数据结构,
数组可以实现hashmap,
数组可以排序之后实现二分法,
数组可以实现插入序的hashmap,
数组可以惰性分配,
数组可以SIMD加速读取,
数组还可以实现各种树状结构...

结果lisp只有一个链表,只允许你一个计数访问,没有随机访问...所以你做什么都需要访问前面的节点...






e2002 发表于 2024-6-26 14:14:09

传址与传值的差异。

czb203 发表于 2024-6-29 21:11:35

你有种再说一遍 发表于 2024-6-26 14:13
因为你不知道什么是数据结构,什么是lisp的数据结构...
cons的底层大概率是一个链表+游离指针实现的(堆也可 ...

{:1_1:}感谢大佬码字讲解
页: [1]
查看完整版本: ssdel和ssadd和cons、subst使用区别