rwsice9 发表于 2022-7-6 08:12:48

排序局部变量?是th

大家好。我需要一些帮助。我甚至不确定这是否可能,但我认为应该是这样。我仍然处于“我知道足够多的LISP,只是有点危险,但有点有用”的阶段
 
我有一个LISP例程,它从用户那里收集5个变量(r1、r2、r3、r4、r5)。
 

(setq r1 (getint "\nEnter First Rev Line Number use ZERO for NONE: "))
(setq r2 (getint "\nEnter Second Rev Line Number use ZERO for NONE: "))
(if (= r2 0)(setq r3 0)(setq r3 (getint "\nEnter Third Rev Line Number use ZERO for NONE: ")))
(if (= r3 0)(setq r4 0)(setq r4 (getint "\nEnter Fourth Rev Line Number use ZERO for NONE: ")))
(if (= r4 0)(setq r5 0)(setq r5 (getint "\nEnter Fifth Rev Line Number use ZERO for NONE: ")))

 
我想对它们做的是,根据它们的值进行排序,将最高值放在首位,然后反向排序。
 
有人能对此有什么见解吗?提前谢谢!

David Bethel 发表于 2022-7-6 08:20:00

看看(vl排序)它是一个相当简单的函数-大卫

rwsice9 发表于 2022-7-6 08:24:18

谢谢大卫。我查找了vl排序的一些语法。。看起来应该足够简单!

rwsice9 发表于 2022-7-6 08:33:36

嗯,我试着让它工作,但我似乎不能使它发生使用我的变量。
 
我有这样的想法:
(setq r1 (getint "\nEnter First Rev Line Number use ZERO for NONE: "))
(setq r2 (getint "\nEnter Second Rev Line Number use ZERO for NONE: "))
(setq r3 (getint "\nEnter Third Rev Line Number use ZERO for NONE: "))
(setq r4 (getint "\nEnter Fourth Rev Line Number use ZERO for NONE: "))
(setq r5 (getint "\nEnter Fifth Rev Line Number use ZERO for NONE: "))      
   
   (setq revs (vl-sort '(r1 r2 r3 r4 r5) '>))
   (setq r1 (nth 0 revs)
       r2 (nth 1 revs)
       r3 (nth 2 revs)
       r4 (nth 3 revs)
       r5 (nth 4 revs))
 
当我尝试运行它时,我得到一个“错误:比较的参数类型错误:R2 R1”。就编写代码而言,这对我来说几乎都是猜测,所以任何人能帮我的都将不胜感激!
 
谢谢

MSasu 发表于 2022-7-6 08:39:16

通过使用quote定义列表,您可以阻止对他的项目进行评估:
 
(setq revs (vl-sort (list r1 r2 r3 r4 r5) '>))
 
当做
米尔恰

rwsice9 发表于 2022-7-6 08:43:00

美好的谢谢
 
现在我需要做的就是找出如果其中一个值为零,如何使其工作。。。
 
现在获取“错误:错误参数类型:fixnump:nil”。。

BIGAL 发表于 2022-7-6 08:50:15

按enter键可能会给你一个“nil”而不是“0”,这不一样

ketxu 发表于 2022-7-6 08:53:56

 
在Getint请求中按Enter键将返回nil如果要返回0,可以这样重新写入:
(mapcar '(lambda(a b)(set a b))
'(r1 r2 r3 r4 r5)
(vl-sort
   (mapcar '(lambda(a)(cond ((getint (strcat "\nEnter " a "Rev Line Number use ZERO for NONE: ")))(0)))
       '("First" "Second" "Third" "Fourth" "Fifth")
   )
   '>
)
)   

David Bethel 发表于 2022-7-6 09:00:22

更基本的用法是:
 
 

(initget 1)
(setq r1 (getint "\nEnter First Rev Line Number use ZERO for NONE: "))
(initget 1)
(setq r2 (getint "\nEnter Second Rev Line Number use ZERO for NONE: "))

 
(initget)使用位标志
 
基本值为:
 
1=非零
2=不为零
4=非负
 
so(initget 7):将强制输入大于0的正数
 
-大卫

rwsice9 发表于 2022-7-6 09:03:11

谢谢,伙计们,我得试试。
 
我想我知道我遇到的问题。。在代码中,我告诉它对5个值进行排序,其中2或3个值可能最终为0。因此,在列表排序后,重复项被删除,如果我尝试从列表中拉出第4和第5个值,它们就不再存在了。。因此,当代码尝试运行时:
(setq r1 (nth 4 revs))。。该值基本上不再存在,因此返回“nil”值。我理解正确吗?
页: [1] 2
查看完整版本: 排序局部变量?是th