This is an informal treatment of Scheme syntax and grammar. For a more formal treatment, in the standard notation computer scientists use for discussing language syntax, see Syntax and Semantics in the How to Design Programs textbook.
(+ 1 2)(* (+ 3 4) 5)(3+4)*5.(= x y)true or false, depending on
whether those two values are equal.(+ 1 2 3 4 5) .)(1 + 2)+ 1 2((+ 1 2))(define variable-name value)(define bignum 1234567890)bignum, so that
subsequently...bignum(* bignum bignum bignum)
(define (function-name parameter parameter ... parameter)
body-expression)
adds a function to the language. Each parameter is a
variable name, and normally these variable names are used
inside the expression.
(define (square n) (* n n))
(define (square n)
(* n n))
produces no result at all, but has the side
effect of defining a new function named
square, taking one parameter (which it refers to
internally as n). Subsequently,...
(square 5)(square n)", decides that the parameter
n is supposed to be 5 for now, replaces all the
"n"'s in the function body with 5, producing
"(* 5 5)", and further evaluates this to get
25.square" function, the
parameter name "n" is introduced in the header
and used in the body, but then it disappears; if you were
then to type
(square n)Scheme would complain that "
n" was undefined.
The only way to use the "square" function is to
provide a number (or an expression whose value is
a number) to match the "n" in the pattern, e.g.
(square 5).(square n)(square 3 4)square function only takes one
parameter.(square)(define (square) (* n n))(define (square n))(define (square n) (* n n)(define (square n) (+ n n))(square 3) you would
get the answer 6 rather than the correct 9. This
illustrates the difference between a program being
legal and being correct.
(cond [question1 answer1]
[question2 answer2]
...
[questionn answern])
returns the value of one of answer1, answer2,
... answern, depending on which question is
the first to have the value true. If
question1 evaluates to true, it returns
answer1; if not, it ignores answer1 and
continues with the rest of the list of question-answer
pairs.
The keyword "else" may appear in place of
questionn to indicate that the cond should return the
value of answern if no previous question was
true.
Another way to look at it is that
(cond [true answer1]
[question2 answer2]
...
[questionn answern])
simplifies to answer1, while
(cond [false answer1]
[question2 answer2]
...
[questionn answern])
simplifies to
(cond [question2 answer2]
...
[questionn answern])
(cond [(> grade 90) 'A]
[(> grade 80) 'B]
[(> grade 70) 'C]
[(> grade 60) (warn 'D)]
[else (warn 'F)])
(cond (< bignum 4) 5
(>= bignum 4) 6)
because the question and answer in each clause must be
surrounded by square brackets; this person probably
meant
(cond [(< bignum 4) 5]
[(>= bignum 4) 6])
(cond [(+ bignum 4) 5]
[(- bignum 4) 6])
because the question must return a boolean (the
expressions "(+ bignum 4)" and "(- bignum
4)" both return numbers instead)
(cond [(< bignum 4) 5)
((>= bignum 4) 6]
because the parentheses and brackets aren't matched.
The parentheses in (< bignum 4) match
nicely, but outside this are a left-bracket and a
right-parenthesis, which don't match. Similarly,
(>= bignum 4) is matched, but outside it are a
left-parenthesis and a right-bracket, which don't
match. Finally, there is no right-parenthesis to match
the one before cond.
(define-struct structure-name (field1 field2
... fieldn))(make-structure-name value1 value2 ...
valuen) takes n objects and returns a
structure-name.(structure-name? object) takes an
object and returns a boolean indicating whether the
object is a structure-name.(structure-name-field1 struct) takes
a structure-name and returns the field1
part of it.(structure-name-fieldn struct) takes
a structure-name and returns the fieldn
part of it.define-struct.
; A student is a symbol (name), a number (GPA), ; a symbol (class, e.g. 'freshman, 'sophomore, etc.), ; and a number (ID). (define-struct student (name GPA class ID)) ; make-student: symbol number symbol number => student ; student?: object => boolean ; student-name: student => symbol ; student-GPA: student => number ; student-class: student => symbol ; student-ID: student => numberThe one line of actual code in this example tells Scheme to add a new data structure to the language, along with its constructor (
make-student),
discriminator (student?), and slot-access
functions (student-name, student-GPA,
student-class, and student-ID).
Subsequently,...
(make-student 'Joe-Schmoe 2.6 'freshman 123456789)creates and returns a new "student" object with the specified properties.
(define my-student (make-student 'Jane-Doe 3.3 'sophomore 987654321))creates a new "student" object and stores it under the new name "
my-student".
(student-name my-student)returns
'Jane-Doe
(student? 'bluebird)false(student? my-student)true(student? (make-student 'Bill 2.8 'junior
918273645))true(student-GPA my-student)make-student,
student?, student-name, etc. explicitly; they are
defined automatically when you say (define-struct
student (name GPA class ID)).