终于搞清楚cond用法了
本帖最后由 小万LISP 于 2019-9-30 14:12 编辑之前用cond总出错,以至于放弃,葵花宝典里的解释又很简单。我来稍微 详细点的用法介绍吧,如有错误请指正哈!
方法一:
[*](setq h (getint"\n请输入数值序号:"))
[*](cond
[*]((= h 1) (setq h 250))
[*]((= h 2) (setq h 550))
[*]((= h 3) (setq h -370))
[*]((= h 4) (setq h -740))
[*](T h)
[*])
[*](print h)
方法二:
[*](setq h (getint"\n请输入数值序号:"))
[*](setq h
[*](cond
[*] ((= h 1)250)
[*] ((= h 2)550)
[*] ((= h 3)-370)
[*] ((= h 4)-740)
[*] (T h)
[*])
[*])
[*](print h)
OK!
You can use list in this case :
(while
(not
(setq h
(cdr
(assoc
(getint "\nPlease enter the numeric number: ")
'((1 . 250)(2 . 550)(3 . -370)(4 . -740))
)
)
)
)
(print "Requires an integer between 1 and 4.")
) cond函数只是测试,与赋值是无关的,楼主的第一种用法是常用的方法,第二种方法虽然正确,但不太常用,并不是效率问题,而是“自由度”问题。
在第一种方法中,先对某个“条件”进行测试,根据满足条件对变量赋值,而这个赋值过程却可以是其它“结果”,可以对h赋值,也可以对其它变量赋值,还可以调用其它函数,但在方法二中,只是在对某个变量的赋值过程中,根据条件进行赋值,相对就不够“自由”,当然,对“结果”也可以是有其它变化,但结构就会显得复杂。所以说,第一种方法更“自由”一些。
就cond函数本身,当测试的“条件”不是很“互斥”时,要注意相互的次序,因为从上到下测试到满足某个条件时,测试就不在向下进行,而最后的t测试(真)是“容错”的意思,就是上面所有条件都不满足的时候才执行的(此时应该是有效输入,一般由initget函数控制)。在楼主的帖子中,除了输入1~4以外,都会对h赋值输入的值,可能是数值5,也可能是字符串ab,这就有可能是自己不需要的,甚至可能是后面代码没法接受的,这就需要在前面做限制(见initget函数的控制位)。 本帖最后由 wyl219 于 2019-10-14 20:40 编辑
(while (not h)
(setq h (getint (strcat "\n请输入高度,或选择预置高度:\n"
"1.250 2.550 3.-370 4.-740")))
(setq h
(cond
((not h) (print "输入错误,请重新输入") nil)
((= h 1)250)
((= h 2)550)
((= h 3)-370)
((= h 4)-740)
(t h)
)
)) 写得很好,欢迎入坑, ysq101 发表于 2019-9-30 01:30
写得很好,欢迎入坑,
感谢鼓励! 如果输入了1~4之外的值怎么办?
最好在cond最后一行加一句:
(T (setq h "输入值有误。")) 谢谢分享 代码考虑不全呀 原地踏步 发表于 2019-9-30 09:29
如果输入了1~4之外的值怎么办?
最好在cond最后一行加一句:
(T (setq h "输入值有误。"))
经典、完美!!! 原地踏步 发表于 2019-9-30 09:29
如果输入了1~4之外的值怎么办?
最好在cond最后一行加一句:
(T (setq h "输入值有误。"))
谢谢指点谢谢指点
页:
[1]
2