does not have a value. Clearly, since Scheme's
calculations must be consistent with mathematics, it too must not equate
<#61827#><#8129#>(/<#8129#>\ <#8130#>1<#8130#>\ <#8131#>0)<#8131#><#61827#> with a value.
In general, if an expression is not a value and if the evaluation rules
allow no further simplification, we say that an error occurred or that the
function raises an error signal. Pragmatically this means that the
evaluation stops immediately with an appropriate error message, such as
<#61828#><#8132#>``/<#8132#><#8133#>:<#8133#>\ <#8134#>divide<#8134#>\ <#8135#>by<#8135#>\ <#8136#>zero''<#8136#><#61828#> for division by zero.
For example, the evaluation of
<#8141#>(+<#8141#> <#8142#>(*<#8142#> <#8143#>20<#8143#> <#8144#>2)<#8144#> <#8145#>(/<#8145#> <#8146#>1<#8146#> <#8147#>(-<#8147#> <#8148#>10<#8148#> <#8149#>10)))<#8149#>
proceeds as follows:
<#8157#>(+<#8157#> <#8158#>(*<#8158#> <#8159#>20<#8159#> <#8160#>2)<#8160#> <#8161#>(/<#8161#> <#8162#>1<#8162#> <#8163#>(-<#8163#> <#8164#>10<#8164#> <#8165#>10)))<#8165#>
<#8166#>=<#8166#> <#8167#>(+<#8167#> <#8168#>40<#8168#> <#8169#>(/<#8169#> <#8170#>1<#8170#> <#8171#>0))<#8171#>
<#8172#>=<#8172#> <#8173#>/:<#8173#> <#8174#>divide<#8174#> <#8175#>by<#8175#> <#8176#>zero<#8176#>
In particular, the error eliminates the context <#61829#><#8180#>(+<#8180#>\ <#8181#>40<#8181#>\ <#8182#>...)<#8182#><#61829#> around
<#61830#><#8183#>(/<#8183#>\ <#8184#>1<#8184#>\ <#8185#>0)<#8185#><#61830#>, which represents the remainder of the computation with
respect to the division.
To understand how run-time errors are signaled, we must inspect the
evaluation rules again. Consider the function
<#70885#>;; <#61831#><#8190#>my-divide<#8190#> <#8191#>:<#8191#> <#8192#>number<#8192#> <#8193#><#8193#><#8194#>-;SPMgt;<#8194#><#8195#><#8195#> <#8196#>number<#8196#><#61831#><#70885#>
<#8197#>(d<#8197#><#8198#>efine<#8198#> <#8199#>(my-divide<#8199#> <#8200#>n)<#8200#>
<#8201#>(c<#8201#><#8202#>ond<#8202#>
<#8203#>[<#8203#><#8204#>(=<#8204#> <#8205#>n<#8205#> <#8206#>0)<#8206#> <#8207#>'<#8207#><#8208#>inf]<#8208#>
<#8209#>[<#8209#><#8210#>else<#8210#> <#8211#>(/<#8211#> <#8212#>1<#8212#> <#8213#>n)]<#8213#><#8214#>))<#8214#>
Now suppose we apply <#61832#><#8218#>my-divide<#8218#><#61832#> to <#61833#><#8219#>0<#8219#><#61833#>. Then the first step is:
<#8224#>(my-divide<#8224#> <#8225#>0)<#8225#>
<#8226#>=<#8226#> <#8227#>(c<#8227#><#8228#>ond<#8228#>
<#8229#>[<#8229#><#8230#>(=<#8230#> <#8231#>0<#8231#> <#8232#>0)<#8232#> <#8233#>'<#8233#><#8234#>inf]<#8234#>
<#8235#>[<#8235#><#8236#>else<#8236#> <#72327#>
It would obviously be wrong to say that the function signals the error ``/:
divide by zero'' now, even though an evaluation of the underlined
subexpression would demand it. After all, <#61835#><#8245#>(=<#8245#>\ <#8246#>0<#8246#>\ <#8247#>0)<#8247#><#61835#> is
<#61836#><#8248#>true<#8248#><#61836#> and therefore the application has a proper result:
<#8253#>(my-divide<#8253#> <#8254#>0)<#8254#>
<#8255#>=<#8255#> <#8256#>(c<#8256#><#8257#>ond<#8257#>
<#8258#>[<#8258#><#8259#>(=<#8259#> <#8260#>0<#8260#> <#8261#>0)<#8261#> <#8262#>'<#8262#><#8263#>inf]<#8263#>
<#8264#>[<#8264#><#8265#>else<#8265#> <#72328#>
Fortunately, our laws of evaluation take care of these situations
automatically. We just need to keep in mind when the laws apply.
For example, in
<#8295#>(+<#8295#> <#8296#>(*<#8296#> <#8297#>20<#8297#> <#8298#>2)<#8298#> <#8299#>(/<#8299#> <#8300#>20<#8300#> <#8301#>2))<#8301#>
the addition cannot take place before the multiplication or
division. Similarly, the underlined division in the
<#61839#><#8305#>cond<#8305#>-expression<#61839#>
<#8310#>(c<#8310#><#8311#>ond<#8311#>
<#8312#>[<#8312#><#8313#>(=<#8313#> <#8314#>0<#8314#> <#8315#>0)<#8315#> <#8316#>'<#8316#><#8317#>inf]<#8317#>
<#8318#>[<#8318#><#8319#>else<#8319#> <#72330#>
cannot be evaluated until the corresponding line is the first condition in
the <#61841#><#8328#>cond<#8328#>-expression<#61841#>.
As a rule of thumb, it is best to keep the following in mind:
<#70890#>;; <#61843#><#8335#>checked-area-of-disk<#8335#> <#8336#>:<#8336#> <#8337#>Scheme-value<#8337#> <#8338#><#8338#><#8339#>-;SPMgt;<#8339#><#8340#><#8340#> <#8341#>boolean<#8341#><#61843#><#70890#>
<#70891#>;; to compute the area of a disk with radius <#61844#><#8342#>v<#8342#><#61844#>, if <#61845#><#8343#>v<#8343#><#61845#> is a number<#70891#>
<#8344#>(d<#8344#><#8345#>efine<#8345#> <#8346#>(checked-area-of-disk<#8346#> <#8347#>v)<#8347#>
<#8348#>(c<#8348#><#8349#>ond<#8349#>
<#8350#>[<#8350#><#8351#>(number?<#8351#> <#8352#>v)<#8352#> <#8353#>(area-of-disk<#8353#> <#8354#>v)]<#8354#>
<#8355#>[<#8355#><#8356#>else<#8356#> <#8357#>(error<#8357#> <#8358#>'<#8358#><#8359#>checked-area-of-disk<#8359#> <#8360#>``number<#8360#> <#8361#>expected'')]<#8361#><#8362#>))<#8362#>
If we were to apply <#61846#><#8366#>checked-area-of-disk<#8366#><#61846#> to a symbol, we would get
the following evaluation:
<#8371#>(-<#8371#> <#8372#>(checked-area-of-disk<#8372#> <#8373#>'<#8373#><#8374#>a)<#8374#>
<#8375#>(checked-area-of-disk<#8375#> <#8376#>10))<#8376#>
<#8377#>=<#8377#> <#8378#>(-<#8378#> <#8379#>(c<#8379#><#8380#>ond<#8380#>
<#8381#>[<#8381#><#8382#>(number?<#8382#> <#8383#>'<#8383#><#8384#>a)<#8384#> <#8385#>(area-of-disk<#8385#> <#8386#>'<#8386#><#8387#>a)]<#8387#>
<#8388#>[<#8388#><#8389#>else<#8389#> <#8390#>(error<#8390#> <#8391#>'<#8391#><#8392#>checked-area-of-disk<#8392#> <#8393#>``number<#8393#> <#8394#>expected'')]<#8394#><#8395#>)<#8395#>
<#8396#>(checked-area-of-disk<#8396#> <#8397#>10))<#8397#>
<#8398#>=<#8398#> <#8399#>(-<#8399#> <#8400#>(c<#8400#><#8401#>ond<#8401#>
<#8402#>[<#8402#><#8403#>false<#8403#> <#8404#>(area-of-disk<#8404#> <#8405#>'<#8405#><#8406#>a)]<#8406#>
<#8407#>[<#8407#><#8408#>else<#8408#> <#8409#>(error<#8409#> <#8410#>'<#8410#><#8411#>checked-area-of-disk<#8411#> <#8412#>``number<#8412#> <#8413#>expected'')]<#8413#><#8414#>)<#8414#>
<#8415#>(checked-area-of-disk<#8415#> <#8416#>10))<#8416#>
<#8417#>=<#8417#> <#8418#>(-<#8418#> <#8419#>(error<#8419#> <#8420#>'<#8420#><#8421#>checked-area-of-disk<#8421#> <#8422#>``number<#8422#> <#8423#>expected'')<#8423#>
<#8424#>(checked-area-of-disk<#8424#> <#8425#>10))<#8425#>
<#8426#>=<#8426#> <#8427#>checked-area-of-disk<#8427#> <#8428#>:<#8428#> <#8429#>number<#8429#> <#8430#>expected<#8430#>
In other words, when we evaluate an the <#61847#><#8434#>error<#8434#><#61847#> expression, we
proceed as if we had encountered a division by zero.