小万LISP 发表于 2019-9-29 23:54:17

终于搞清楚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!

ketxu 发表于 2019-9-30 19:03:15

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.")
)

ll_j 发表于 2019-9-30 16:35:50

cond函数只是测试,与赋值是无关的,楼主的第一种用法是常用的方法,第二种方法虽然正确,但不太常用,并不是效率问题,而是“自由度”问题。
在第一种方法中,先对某个“条件”进行测试,根据满足条件对变量赋值,而这个赋值过程却可以是其它“结果”,可以对h赋值,也可以对其它变量赋值,还可以调用其它函数,但在方法二中,只是在对某个变量的赋值过程中,根据条件进行赋值,相对就不够“自由”,当然,对“结果”也可以是有其它变化,但结构就会显得复杂。所以说,第一种方法更“自由”一些。
就cond函数本身,当测试的“条件”不是很“互斥”时,要注意相互的次序,因为从上到下测试到满足某个条件时,测试就不在向下进行,而最后的t测试(真)是“容错”的意思,就是上面所有条件都不满足的时候才执行的(此时应该是有效输入,一般由initget函数控制)。在楼主的帖子中,除了输入1~4以外,都会对h赋值输入的值,可能是数值5,也可能是字符串ab,这就有可能是自己不需要的,甚至可能是后面代码没法接受的,这就需要在前面做限制(见initget函数的控制位)。

wyl219 发表于 2019-9-30 13:02:55

本帖最后由 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:22

写得很好,欢迎入坑,

小万LISP 发表于 2019-9-30 07:58:54

ysq101 发表于 2019-9-30 01:30
写得很好,欢迎入坑,

感谢鼓励!

原地踏步 发表于 2019-9-30 09:29:22

如果输入了1~4之外的值怎么办?
最好在cond最后一行加一句:
(T (setq h "输入值有误。"))

start4444 发表于 2019-9-30 10:20:49

谢谢分享

烟盒迷唇 发表于 2019-9-30 11:18:57

代码考虑不全呀

xvjiex 发表于 2019-9-30 11:22:01

原地踏步 发表于 2019-9-30 09:29
如果输入了1~4之外的值怎么办?
最好在cond最后一行加一句:
(T (setq h "输入值有误。"))

经典、完美!!!

小万LISP 发表于 2019-9-30 14:13:11

原地踏步 发表于 2019-9-30 09:29
如果输入了1~4之外的值怎么办?
最好在cond最后一行加一句:
(T (setq h "输入值有误。"))

谢谢指点谢谢指点
页: [1] 2
查看完整版本: 终于搞清楚cond用法了