`
阿尔萨斯
  • 浏览: 4184748 次
社区版块
存档分类
最新评论

Lisp语言:条件判断

 
阅读更多
学习了Lisp语言的控制台输出与输入,让我们来看看Lisp语言的条件判断。

Lisp中的条件判断看起来和其它语言差不多,学习起来还是比较简单的。

1. 基本用法:

基本的用法像下面这个样子:

(if          条件判断                条件成立时的结果           条件不成立时的结果)

我把其中的空间加长了,看起来比较清晰,反正Lisp对一个空格和多个空格的处理是一样的。

按上面的用法,Lisp中实际使用if类似于下面这样:

(if (> 3 2)  "messagea" "messageb")

上面语句判断3是否大于2,如果3大于2的话会返回“messagea”,否则会返回“messageb”

3当然大于2啦,所以上面的语句会返回“messagea”,你可以启动Clisp,输入以上代码进行测试。



2. 省略第四个元素

条件判断语句中的第四个元素是可以省略的,可以写成下面这样:

(if          条件判断                条件成立时的结果 )

比如你可以将语句写成这样:

(if (> 3 2)  "messagea" )

执行后会返回“messagea”

如果条件不成立,则CLisp会返回NIL

如下面这样的语句会返回NIL

(if (< 3 2)  "messagea" )

因为3<2这样的条件不成立,所以CLisp会返回NIL



3. T 和 NIL


那么,NIL是什么呢?NIL是Lisp里的“false”。

对应的,T是Lisp离得“true”。

所以下面第一个语句返回“message A”,而第二句语句返回的是“message B”。

(if T “message A” "message B")

(if NIL "message A" "messageB")
另外,在Clisp里,除了NIL以为,其它所有合法的元素都被当作是T,比如下面的语句也会返回“message A”

(if   "just a string" “message A” "message B")




4. 有关else if

其它语言里的条件判断语句都有if () else if ()这样的用法,在第一个条件不满足是进一步判断第二个条件,在Lisp里有没有对应的用法呢?

在Lisp里可以将第二个条件判断嵌套到第一个条件判断中来完成类似else if的判断,像下面这样:

(if          第一个条件判断                第一个条件成立时的结果           (if      第二个条件判断     第二个条件成立时的结果      第二个条件不成立的结果))

实际的使用类似于这样的:

(if          (<   a   10)        " a 小于10"        (  if     (<  a  20)   "  a 大于等于10,不过小于20"   "a 大于等于20"))

有编程经验的人可以从语句中清晰的看到程序执行的过程,该语句对a进行判断,如果a小于10则返回“a小于10”,如果a大于等于10则开始计算后面的结果,而后面的语句本身又是一个if判断,于是开始第二个条件判断的计算,这时如果a小于20则返回“a大于等于10,不过小于20”,否则返回“a大于等于20”。

这里面要注意的是后面的if是包含在一对括号里的,形成了嵌套关系,如果不加括号,写成下面这样会报错的:

(if          (<   a   10)        " a 小于10"          if     (<  a  20)   "  a 大于等于10,不过小于20"   "a 大于等于20")


5. 简单样例


现在让我们在上一篇文章的main方法里加一些条件判断,做个简单的样例。上一篇文章链接如下:
http://blog.csdn.net/keyboardota/article/details/7614545

修改后样例希望用户输入一个数字,然后对数字进行判断,看输入的数字是小于10,还是大于等于10,如果是大于等于10则进一步判断输入的数字是否小于20.

样例很简单,不过需要先解决一个问题,就是将用户输入的文本转换成数字,转换使用的是parse-integer函数,同时使用了:junk-allowed T参数,允许输入的文字不是数字,如果输入的不是数字的话该函数会返回NIL。

另外一点是Clisp环境中可以支持中文显示和中文变量名,写出来的函数如下:(不过有个善意的提醒,除非有一定必要,否则不要使用中文变量名,应为全角半角之类的原因容易打错,而且在VIM环境中输入中文不方便。)

(defun main ()

        (format *query-io* "请输入一个数字:")
        (force-output *query-io*)
        (setq 输入的内容 (read-line *query-io*))
        (setq 转换结果 (parse-integer 输入的内容 :junk-allowed T))
        (if 转换结果
                (format *query-io* "~a ~a ~%" "你输入的数字是:" 转换结果)
                (format *query-io* "亲!你输入的不是一个数字oh!~%"))
        (if (< 转换结果 10)
                (format *query-io* "输入的数字小于10~%")
                (if (< 转换结果    20)
                        (format *query-io* "输入的数字大于等于10,不过小于20~%")
                        (format *query-io* "输入的数字大于等于20~%")))
        (force-output *query-io*)

)




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics