-
Notifications
You must be signed in to change notification settings - Fork 438
/
040-conditionals.html
112 lines (106 loc) · 6.23 KB
/
040-conditionals.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-CN" />
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="author" content="songjinghe" />
<meta name="Copyright" content="GNU Lesser General Public License" />
<meta name="description" content="Teach Yourself Scheme in Fixnum Days的简体中文译版" />
<meta name="keywords" content="scheme,教程" />
<title>第四章 条件语句</title>
<link rel="stylesheet" href="stylesheets/main.css">
<script>var _hmt=_hmt||[];(function(){var hm=document.createElement("script");hm.src="//hm.baidu.com/hm.js?379b64254bb382c4fa11fad6cb4e98de";var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm,s);})();</script>
<script type="text/javascript">document.write(unescape("%3Cspan style='display:none' id='cnzz_stat_icon_1253043874'%3E%3C/span%3E%3Cscript src='http://s19.cnzz.com/z_stat.php%3Fid%3D1253043874' type='text/javascript'%3E%3C/script%3E"));</script>
</head>
<body>
<h1>第四章 条件语句</h1>
<p>和其它的编程语句一样,Scheme 也包含条件语句。</p>
<p>最基本的结构就是if:</p>
<pre><code class="lang-scheme">(if 测试条件
then-分支
else-分支)</code></pre>
<p>如果测试条件运算的结果是真(即,非<code>#f</code>的任何其它值),<code>then</code>分支将会被运行(即满足条件时的运行分支)。否则,<code>else</code>分支会被运行。<code>else</code>分支是可选的。</p>
<pre><code class="lang-scheme">(define p 80)
(if (> p 70)
'safe
'unsafe)
=> safe
(if (< p 90)
'low-pressure) ;no ``else'' branch
=> low-pressure</code></pre>
<p>为了方便,Scheme还提供了一些其它的条件结构语句。它们可以被定义成宏来扩充if表达式。</p>
<h2>4.1 when 和 unless</h2>
<p>当我们只需要一个基本条件语句分支时(”then”分支或”else”分支),使用when 和 unless会更方便。(这里的示例已经更换,原示例)</p>
<pre><code class="lang-scheme">(define a 10)
(define b 20)
(when (< a b)
(display “a是”)
(display a)
(display “b是”)
(display b)
(display “a大于b” ) )</code></pre>
<p>先判断a是否小于b,这个条件成立时会输出5条信息。</p>
<p>使用if实现相同的程序会是这样:</p>
<pre><code class="lang-scheme">(define a 10)
(define b 20)
(if (< a b)
(begin
(display “a是”)
(display a)
(display “b是”)
(display b)
(display “a大于b” ) ))</code></pre>
<p>注意<code>when</code>的分支是一个隐式的<code>begin</code>语句结构,
而如果<code>if</code>的分支有多个代码结构时,需要一个显式的<code>begin</code>代码结构。</p>
<p>同样的功能还可以像下面这样用<code>unless</code>来写(<code>unless</code>和<code>when</code>的意思正好相反):</p>
<pre><code class="lang-scheme">(define a 10)
(define b 20)
(unless (>= a b)
(display “a是”)
(display a)
(display “b是”)
(display b)
(display “a大于b” ) )</code></pre>
<p>并不是所有的Scheme环境都提供<code>when</code>和<code>unless</code>。
如果你的Scheme中没有,你可以用宏来自定义出<code>when</code>和<code>unless</code>(宏,见第8章)。</p>
<h2>4.2 cond</h2>
<p><code>cond</code>结构在表示多重<code>if</code>表达式时很方便,
多重<code>if</code>结构除了最后一个<code>else</code>分支以外的其余分支都会包含一个新的<code>if</code>条件。因此,</p>
<pre><code class="lang-scheme">(if (char<? c #\c) -1
(if (char=? c #\c) 0
1))</code></pre>
<p>这样的结构都可以使用<code>cond</code>来这样写:</p>
<pre><code class="lang-scheme">(cond ((char<? c #\c) -1)
((char=? c #\c) 0)
(else 1))</code></pre>
<p><code>cond</code>就是这样的一种多分支条件结构。每个从句都包含一个判断条件和一个相关的操作。第一个判断成立的从句将会引发它相关的操作执行。如果任何一个分支的条件判断都不成立则最后一个<code>else</code>分支将会执行(<code>else</code>分支语句是可选的)。</p>
<p>cond的分支操作都是<code>begin</code>结构。</p>
<h2>4.3 case</h2>
<p>当<code>cond</code>结构的每个测试条件是一个测试条件的分支条件时,可以缩减为一个<code>case</code>表达式。</p>
<pre><code class="lang-scheme">(define c #\c)
(case c
((#\a) 1)
((#\b) 2)
((#\c) 3)
(else 4))
=> 3</code></pre>
<p>分支头值是<code>#\c</code> 的分支将被执行。</p>
<h2>4.4 and 和 or</h2>
<p>Scheme提供了对boolean值进行逻辑与<code>and</code>和逻辑或<code>or</code>运算的结构。(我们已经见过了布尔类型的求反运算not过程。)</p>
<p>当所有子结构的值都是真时,<code>and</code>的返回值是真,实际上,<code>and</code>的运行结果是最后一个子结构的值。如果任何一个子结构的值都是假,则返回<code>#f</code>。</p>
<pre><code class="lang-scheme">(and 1 2) => 2
(and #f 1) => #f</code></pre>
<p>而<code>or</code>会返回它第一个为值为真的子结构的结果。如果所有的子结构的值都为假,<code>or</code>则返回<code>#f</code>。</p>
<pre><code class="lang-scheme">(or 1 2) => 1
(or #f 1) => 1</code></pre>
<p><code>and</code>和<code>or</code>都是从左向右运算。当某个子结构可以决定最终结果时,<code>and</code>和<code>or</code>会忽略剩余的子结构,即它们是“短路”的。</p>
<pre><code class="lang-scheme">(and 1 #f expression-guaranteed-to-cause-error)
=> #f
(or 1 #f expression-guaranteed-to-cause-error)
=> 1</code></pre>
<!-- <script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script> -->
</body>
</html>