📄 r5rs-z-h-8.html
字号:
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"><html><!-- Generated from TeX source by tex2page, v 4o4, (c) Dorai Sitaram, http://www.cs.rice.edu/~dorai/tex2page --><head><title>Revised^5 Report on the Algorithmic Language Scheme</title><link rel="stylesheet" type="text/css" href="r5rs-Z-C.css" title=default><meta name=robots content="noindex,follow"></head><body><p><div class=navigation>[Go to <span><a href="r5rs.html">first</a>, <a href="r5rs-Z-H-7.html">previous</a></span><span>, <a href="r5rs-Z-H-9.html">next</a></span> page<span>; </span><span><a href="r5rs-Z-H-2.html#%_toc_start">contents</a></span><span><span>; </span><a href="r5rs-Z-H-15.html#%_index_start">index</a></span>]</div><p><a name="%_chap_5"></a><h1 class=chapter><div class=chapterheading><a href="r5rs-Z-H-2.html#%_toc_%_chap_5">Chapter 5</a></div><p><a href="r5rs-Z-H-2.html#%_toc_%_chap_5">Program structure</a></h1><p><p><a name="%_sec_5.1"></a><h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_5.1">5.1 Programs</a></h2><p>A Scheme program consists of a sequence of expressions, definitions,and syntax definitions.Expressions are described in chapter <a href="r5rs-Z-H-7.html#%_chap_4">4</a>;definitions and syntax definitions are the subject of the rest of thepresent chapter.<p>Programs are typically stored in files or entered interactively to arunning Scheme system, although other paradigms are possible;questions of user interface lie outside the scope of this report.(Indeed, Scheme would still be useful as a notation for expressingcomputational methods even in the absence of a mechanicalimplementation.)<p>Definitions and syntax definitions occurring at the top level of a programcan be interpreteddeclaratively.They cause bindings to be created in the top levelenvironment or modify the value of existing top-level bindings.Expressions occurring at the top level of a program areinterpreted imperatively; they are executed in order when the program isinvoked or loaded, and typically perform some kind of initialization.<p>At the top level of a program <tt>(begin <form<sub>1</sub>> <tt>...</tt>)</tt> isequivalent to the sequence of expressions, definitions, and syntax definitionsthat form the body of the <tt>begin</tt>.<p><p><a name="%_sec_5.2"></a><h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_5.2">5.2 Definitions</a></h2><p><p>Definitions are valid in some, but not all, contexts where expressionsare allowed. They are valid only at the top level of a <program>and at the beginning of a <body>.<a name="%_idx_188"></a><p>A definition should have one of the following forms:<a name="%_idx_190"></a><p><p><ul><p><li><tt>(define <variable> <expression>)</tt><p><li><tt>(define (<variable> <formals>) <body>)</tt><p><Formals> should be either asequence of zero or more variables, or a sequence of one or morevariables followed by a space-delimited period and another variable (asin a lambda expression). This form is equivalent to<tt><p>(define <variable><br> (lambda (<formals>) <body>)).<p></tt><p><li><tt>(define (<variable> . <formal>) <body>)</tt><p><Formal> should be a singlevariable. This form is equivalent to<tt><p>(define <variable><br> (lambda <formal> <body>)).<p></tt><p></ul><p><p><a name="%_sec_5.2.1"></a><h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_5.2.1">5.2.1 Top level definitions</a></h3><p>At the top level of a program, a definition<tt><p>(define <variable> <expression>)<p></tt>has essentially the same effect as the assignment expression<tt><p>(<tt>set!</tt> <variable> <expression>)<p></tt>if <variable> is bound. If <variable> is not bound,however, then the definition will bind <variable> to a newlocation before performing the assignment, whereas it would be an errorto perform a <tt>set!</tt> on an unbound<a name="%_idx_192"></a> variable.<p><tt><p>(define add3<br> (lambda (x) (+ x 3)))<br>(add3 3) ===> 6<br>(define first car)<br>(first '(1 2)) ===> 1<p></tt><p>Some implementations of Scheme use an initial environment inwhich all possible variables are bound to locations, most ofwhich contain undefined values. Top level definitions insuch an implementation are truly equivalent to assignments.<p><p><a name="%_sec_5.2.2"></a><h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_5.2.2">5.2.2 Internal definitions</a></h3><p><p>Definitions may occur at thebeginning of a <body> (that is, the body of a <tt>lambda</tt>,<tt>let</tt>, <tt>let*</tt>, <tt>letrec</tt>, <tt>let-syntax</tt>, or <tt>letrec-syntax</tt>expression or that of a definition of an appropriate form).Such definitions are known as <em>internal definitions</em> <a name="%_idx_194"></a> as opposed to the top level definitions described above.The variable defined by an internal definition is local to the<body>. That is, <variable> is bound rather than assigned,and the region of the binding is the entire <body>. For example,<p><tt><p>(let ((x 5))<br> (define foo (lambda (y) (bar x y)))<br> (define bar (lambda (a b) (+ (* a b) a)))<br> (foo (+ x 3))) ===> 45<p></tt><p>A <body> containing internal definitions can always be convertedinto a completely equivalent <tt>letrec</tt> expression. For example, the<tt>let</tt> expression in the above example is equivalent to<p><tt><p>(let ((x 5))<br> (letrec ((foo (lambda (y) (bar x y)))<br> (bar (lambda (a b) (+ (* a b) a))))<br> (foo (+ x 3))))<p></tt><p>Just as for the equivalent <tt>letrec</tt> expression, it must bepossible to evaluate each <expression> of every internaldefinition in a <body> without assigning or referring tothe value of any <variable> being defined.<p>Wherever an internal definition may occur<tt>(begin <definition<sub>1</sub>> <tt>...</tt>)</tt>is equivalent to the sequence of definitionsthat form the body of the <tt>begin</tt>.<p><a name="%_sec_5.3"></a><h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_5.3">5.3 Syntax definitions</a></h2><p>Syntax definitions are valid only at the top level of a <program>.<a name="%_idx_196"></a>They have the following form:<a name="%_idx_198"></a><p><tt>(define-syntax <keyword> <transformer spec>)</tt><p><Keyword> is an identifier, andthe <transformer spec> should be an instance of <tt>syntax-rules</tt>.The top-level syntactic environment is extended by binding the<keyword> to the specified transformer.<p>There is no <tt>define-syntax</tt> analogue of internal definitions.<p>Although macros may expand into definitions and syntax definitions inany context that permits them, it is an error for a definition or syntaxdefinition to shadow a syntactic keyword whose meaning is needed todetermine whether some form in the group of forms that contains theshadowing definition is in fact a definition, or, for internal definitions,is needed to determine the boundary between the group and the expressionsthat follow the group. For example, the following are errors:<p><tt><p>(define define 3)<br><br>(begin (define begin list))<br><br>(let-syntax<br> ((foo (syntax-rules ()<br> ((foo (proc args ...) body ...)<br> (define proc<br> (lambda (args ...)<br> body ...))))))<br> (let ((x 3))<br> (foo (plus x y) (+ x y))<br> (define foo x)<br> (plus foo x)))<br><p></tt><p> <p><p><div class=navigation>[Go to <span><a href="r5rs.html">first</a>, <a href="r5rs-Z-H-7.html">previous</a></span><span>, <a href="r5rs-Z-H-9.html">next</a></span> page<span>; </span><span><a href="r5rs-Z-H-2.html#%_toc_start">contents</a></span><span><span>; </span><a href="r5rs-Z-H-15.html#%_index_start">index</a></span>]</div><p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -