hei 发表于 2022-7-5 18:23:47

反转功能不工作

大家好。
 
所以我在这里,试图创建一个lisp命令,并且已经停留在它的第一部分(是的,我对lisp和任何与编程相关的东西都有点陌生)
 
无论如何,代码如下:
 
(defun c:test ( / pl ent chequeo vert)

(prompt "\nSeleccione objeto")
(setq pl (entget (car (entsel))))

(foreach ent pl
        (setq chequeo (car ent))
        (if (= chequeo 10)
        (setq vert (cons (cdr ent) vert))
        )
)
(reverse vert)
(print vert)(princ)
)
 
所以我注意到我正在创建的新列表中的项目按我想要的错误方式排序,然后我找到了一个反向函数,为我修复了它,只是什么都没有发生。无论我是否在命令中使用REVERSE,列表似乎保持不变,因此我不确定是我在这里做错了什么,还是我使用了REVERSE函数。
 
感谢您的帮助
 
提前感谢

marko_ribar 发表于 2022-7-5 18:35:14


(defun c:test ( / plenx dxf chequeo vert )

(setq plenx (entget (car (entsel "\nSeleccione objeto"))))

(foreach dxf plenx
   (setq chequeo (car dxf))
   (if (= chequeo 10)
   (setq vert (cons (cdr dxf) vert))
   )
)
(setq vert (reverse vert))
(print vert)
(princ)
)
HTH,M.R。

hei 发表于 2022-7-5 18:36:04

哈哈,现在看起来有点明显了。非常感谢,它现在正在工作!
 
但这让我想知道。。。我看到过其他代码,它们在手上没有setq,现在我很困惑什么时候应该在命令之前使用setq,什么时候不需要

kpblc 发表于 2022-7-5 18:43:25

为什么不使用vl remove if not功能?

satishrajdev 发表于 2022-7-5 18:51:19

当您通过Entsel发送信息时,不需要提示功能:-

(setq pl (entget (car (entsel "\nSeleccione objeto"))))

执行此操作有不同的方法,例如:-
 
Foreach公司

(foreach l pl
(if (= (car l) 10)
   (setq v (cons (cdr l) v))
)
)
(setq v (reverse v))

 
地图车

(vl-remove nil
           (mapcar '(lambda (x)
                      (if (eq (car x) 10)
                        (cdr x)
                      )
                  )
                   pl
           )
)

 
如果没有,则删除Vl

(mapcar        'cdr
        (vl-remove-if-not
          '(lambda (x)
             (eq (car x) 10)
           )
          pl
        )
)

Lee Mac 发表于 2022-7-5 18:57:09

 
FWIW,这里是几个“massoc”函数的性能比较。

satishrajdev 发表于 2022-7-5 19:02:33

 
很好的比较李先生。。。
 
我的功能比较:-

   (PROGN (FOREACH L PL (IF (= (CAR L) ...).....1669 / 1.34 <fastest>
   (VL-REMOVE nil (MAPCAR (QUOTE (LAMBD...).....1903 / 1.17
   (MAPCAR (QUOTE CDR) (VL-REMOVE-IF-NO...).....2231 / 1 <slowest>

tombu 发表于 2022-7-5 19:06:47

 
要更改vert的值,必须以某种方式重置其值,但并不总是需要使用setq。您可以使用函数的输出,而无需将其保存为值。也许这就是你想的?
(defun c:test ( / pl ent chequeo vert)

(prompt "\nSeleccione objeto")
(setq pl (entget (car (entsel))))

(foreach ent pl
        (setq chequeo (car ent))
        (if (= chequeo 10)
        (setq vert (cons (cdr ent) vert))
        )
)
(reverse vert)
)

hei 发表于 2022-7-5 19:12:10

 
哇,最有效的一个似乎是把自己称为一个函数?这怎么可能?它似乎被称为递归,但我试图搜索有关它的材料,但似乎没有一个是我可以理解的lol。
 
当我完成我在这里试图完成的任务时,我将进一步研究它(试图使它更有效)
 
无论如何,出现了另一个问题,所以我只在这里发布,希望有人能够帮助我,而不必制作新的线程:
 
目前,我有以下代码:
 
(setq y-aux (mapcar 'cadr vert))
(print y-aux)(princ)
(setq n 0)
(repeat (- n-veces 1)
        (setq h-aux (- (min (nth n y-aux) (nth (+ n 1) y-aux)) (nth n y-fund)))
        (print h-aux)(princ)
        (set h-fund (cons h-aux h-fund))
        (print "checkpoint")(princ)
        (setq n (+ n 1))
)
 
这就是Autocad返回给我的信息:
 
(7.99292 8.07037 8.15563 8.25114 8.35942 8.48295 8.62478 8.78742 8.97419 9.1877 9.4312 9.70793 10.0208 10.3739 10.7689 11.1954 11.6348 12.0677 12.4751 12.8378 13.137 13.3557 13.486 13.535 13.5121 13.4241 13.2795 13.0853 12.8488 12.5772 )
1.57056 ; error: bad argument type: symbolp nil
 
我添加了打印功能,以查看我把事情搞砸了,从它返回给我的信息来看,似乎是以下代码出错了(考虑到它正在正确打印y-aux和h-fund)
 
(set h-fund (cons h-aux h-fund))
 
知道为什么吗?我以前做过三次完全相同的函数(但变量不同),除了这一次,它们都很好。
 
提前感谢!

Lee Mac 发表于 2022-7-5 19:20:49

错误如下:
(set h-fund (cons h-aux h-fund))
与setq不同,set函数将同时计算符号和值参数(setq仅计算值参数),从而计算符号h-fund,该符号h-fund的值明显为零。
 
这应该是:
(setq h-fund (cons h-aux h-fund))
或:
(set 'h-fund (cons h-aux h-fund))
页: [1] 2
查看完整版本: 反转功能不工作