[racket] Simple Scheme Interpreter written in Drracket

From: Peter Breitsprecher (pkbreits at lakeheadu.ca)
Date: Tue Nov 9 15:50:45 EST 2010

Ok, here is the exact assignment.

*
*

*Tiny Scheme Details**:* The Scheme or LISP that you are going to implement
should include the following primitives:

*T, NIL, CAR, CDR, CONS, ATOM, EQ, NULL, INT,*

*PLUS, MINUS, TIMES, LESS, GREATER COND, QUOTE, DEFINE.*

T and NIL represent true and false. In general atoms may be identifiers or
integers. An identifier will start with a letter of the alphabet, and maybe
followed by one or more letters or digits; only uppercase letters will be
used. No underscores or other characters are allowed in identifiers.
Integers may be signed or unsigned,

i.e., 25, +25, -25 are all legal.



CAR, CDR, CONS are the standard Scheme primitive functions. ATOM returns T
if its argument is atomic, and returns NIL otherwise. INT returns T if its
argument is an atom that is a number. EQ works only on atomic arguments; it
returns T if its two atomic arguments are the same [or equal, for numbers]
and NIL otherwise. NULL returns T if its argument is NIL and NIL otherwise
(non-atomic arguments should be acceptable to NULL).

PLUS, MINUS etc., take two numbers [integers] as their arguments and return
the result [an integer]. LESS and GREATER allow you to compare two integers
and return T if the first is less or greater than the second respectively.



COND and QUOTE are the standard Scheme forms. DEFINE allows the user to
define a new function and use it later. A function definition looks like

(define (f x) fb )



where f is the function being defined; its formal parameter(s) is named x;
and its body is the Scheme expression fb. When this is "evaluated", it
should add a pair (f . ((X Y) . fb)) to the d-list [the list of definitions
that your interpreter should maintain internally; actually, how you store
function definitions on the d-list is up to you; the above is only one
possibility]. The features of Tiny Scheme that have not been included are:
LAMBDA, LABEL. These are not needed because Define is sufficient for
defining new functions.

I thought it would be easier to post it all instead of trying to explain it.

On 9 November 2010 15:37, John Clements <clements at brinckerhoff.org> wrote:

>
> On Nov 9, 2010, at 12:32 PM, Peter Breitsprecher wrote:
>
> > Ok, here is the code I have written so far for the function I am having
> trouble with...
> >
> > (define (rep-loop)
> >   (newline)
> >   (display "repl>")
> >   (read-token))
>
> I'm going to ignore rep-loop.
>
> >
> > (define (read-token)
> >   (let ((expr (read-char)))
> >     ((cond [(char-whitespace? expr) (read-token1)]
> >            [(eq? expr #\() (read-token2)]
> >            [(eq? expr #\)) (read-token3)]
> >            [(char-alphabetic? expr) (read-token4)]
> >            [(char-numeric? expr) (read-token5)]
> >            [else (display "Exiting Loop")]))))
>
> Okay! we've got a name: read-token.
>
> The way it's written, it's going to be very hard to test.  This is because
> it operates on typed-in input.
>
> This program would be much easier to develop if you could write a function
> that accepts strings as input.  Can we break the problem up this way?
>
> John Clements
>
>
> > The cond calls other functions I have written just so I could see it if
> was reading the output letter by letter...  Now I need to make read-token
> read the whole word if it sees a character and the entire number if it sees
> a number.
> >
> > Is that getting closer?
> >
> > On 9 November 2010 15:28, John Clements <clements at brinckerhoff.org>
> wrote:
> >
> > On Nov 9, 2010, at 12:27 PM, Peter Breitsprecher wrote:
> >
> > > I'd lie but no.. I was just trying to clarify what I was looking for.
>  I gave a the code for one of the functions I had written, and then an
> example of the input the user is giving below, and then tried to describe in
> more detail what I needed help with...
> >
> > Well, I'm glad you're not lying :).
> >
> > Can you start by picking a name for the function that you're trying to
> write?
> >
> > John Clements
> >
> >
> > > On 9 November 2010 15:23, Shriram Krishnamurthi <sk at cs.brown.edu>
> wrote:
> > > Hi,
> > >
> > > That would not be considered an "example" for at least two reasons. Do
> you see why?
> > >
> > >
> > >> On Nov 9, 2010 12:17 PM, "Peter Breitsprecher" <pkbreits at lakeheadu.ca>
> wrote:
> > >>
> > >> As an example, I want have most of the functions for Plus, Minus
> already written.
> > >>
> > >> Here is the code for it.
> > >>
> > >> (define (plus num1 num2)
> > >> (+ num1 num2))
> > >>
> > >> That is childs stuff...  Here is where I am having the problem, and
> please keep in mind I am new to DrRacket...
> > >>
> > >> If my program accepts input such as
> > >> (plus 13 5)
> > >>
> > >> I need to parse it so that I know what it is asking for.  If It is a
> left parent, then I need to move on, if it is a right parent, move on to the
> next character, once i get to the next character I can see it is an
> alphanumeric character, but then I need to somehow read the whole word, so
> that I can store that value in a variable so that I can read the next
> number.  If the numbers are single digits, it is easy, because they are only
> one charater each and read-char works perfect, but I need something like a
> read-word, or read-number and I can't seem to figure out how to do it.
> > >>
> > >> So really I need to know how do I read the words when there are
> characters present, and read the whole numbers when there is a number
> present.
> > >>
> > >>
> > >>
> > >> On 9 November 2010 15:00, John Clements <clements at brinckerhoff.org>
> wrote:
> > >> >
> > >> >
> > >> > On Nov 9, 2010, a...
> > >>
> > >> --
> > >> Kurt Breitsprecher
> > >> (807) 474-9601
> > >> pkbreits at lakeheadu.ca
> > >>
> > >>
> > >> _________________________________________________
> > >>  For list-related administrative tasks:
> > >>  http://lists.racket-lang.org/listinfo/users
> > >
> > >
> > >
> > > --
> > > Kurt Breitsprecher
> > > (807) 474-9601
> > > pkbreits at lakeheadu.ca
> > >
> >
> >
> >
> >
> > --
> > Kurt Breitsprecher
> > (807) 474-9601
> > pkbreits at lakeheadu.ca
> >
>
>


-- 
Kurt Breitsprecher
(807) 474-9601
pkbreits at lakeheadu.ca
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20101109/7ebad887/attachment.html>

Posted on the users mailing list.