[racket] missing solution 20.1.1 ex:sem-funcs

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Mon Sep 15 09:49:18 EDT 2014

Good. 


On Sep 15, 2014, at 9:20 AM, Daniel Bastos <dbastos at toledo.com> wrote:

> On Fri, Sep 12, 2014 at 6:43 PM, 
> Matthias Felleisen <matthias at ccs.neu.edu> wrote:
> 
> 
> On Sep 12, 2014, at 4:40 PM, Daniel Bastos <dbastos at toledo.com> wrote:
> 
> > Again, we start with (2) and apply a series of substitutions.
> >
> >     (f f)
> >   = (<var> <var>) ;; since f is a <var>
> >   = (<exp> <exp>) ;; since <var> is a subset of <exp>
> >
> > However, (<exp> <exp>) is not by definition a value. It is an
> > expression which may or may not /have/ a value. We know the
> > definition of f, however, which tells us that it behaves like
> > the identity function. So the evaluation of that (<exp> <exp>)
> > yields a function, which is a value. We end with
> >
> >   = <val>
> >
> > Therefore (2) is a value
> 
> Is there a difference between the statements
> 
>  "Daniel is a hat."
> 
> and
> 
>  "Daniel has a hat."
> 
> or do they really mean the same thing?
> 
> There's a difference.
>  
> In this spirit, is there a difference between the statement
> 
>  "(f f) is a value."
> 
> and
> 
>  "(f f) has a value."
> 
> or do they really mean the same thing?
> 
> There's a difference. The analogy is good. (I do remember having read this analogy in the book, though I can't seem to find it right now.)
> 
> Here's my final rewrite. Feel free to scrutinize it. (BTW, thanks for your attention.)
> 
> Exercise 20.1.1. Assume the Definitions window in DrScheme contains
> (define (f x) x). Identify the values among the following expressions:
> 
>  (1) (cons f empty)
>  (2) (f f)
>  (3) (cons f (cons 10 (cons (f 10) empty)))
> 
> Explain why they are values and why the remaining expressions are not
> values.
> 
> Solution. A value is anything of the form
> 
>   <val> = <boo> | <sym> | <num> | empty | <lst>
>   | <var> (names of defined functions)
>   | <prm>
> 
> where <lst> is of the form
> 
>   <lst> = empty | (cons <val> <lst>).
> 
> Now we start with (1) and apply a series of substitutions based on the
> definitions we have.
> 
>     (cons f empty)
>   = (cons <var> <lst>)  ;; since f is a <var>
>   = (cons <var> <lst>)  ;; since empty is a <lst>
>   = (cons <val> <lst>)  ;; since <var> is a subset of <val>
>   = <lst>               ;; definition of <lst>
>   = <val>               ;; definition of <val>
> 
> Therefore (1) is a value.
> 
> Next we consider (2). Here's a relevant part of the grammar for (2).
> 
>   <exp> = <var>
>   | <prm>
>   | (<exp> <exp> ...<exp>)
> 
> Start with (2)...
> 
>     (f f)
>   = (<var> <var>) ;; since f is a <var>
>   = (<exp> <exp>) ;; since <var> is a subset of <exp>
> 
> Now (<exp> <exp>) is not by definition a value. Expressions may have
> values, but they're not values. (Daniel may have a hat, but Daniel is
> not a hat.)
> 
> Therefore (2) is not a value.
> 
> Now (3).
> 
>     (cons f (cons 10 (cons (f 10) empty)))
>   = (cons <var> (cons <num> (cons (<var> <num>) <lst>)))
> 
> The whole expression depends on the application (<exp> <exp>),
> which may or may not have a value. Since we know f, we know it has a value,
> but it /is not/ a value.
> 
> Therefore (3) is not a value.



Posted on the users mailing list.