R7RS SCHEME
C
hr
i
st
i
an
S
t
i
gen Larsen
2013
-
08
-
29
Slide 2
Slide 2 text
«Programming languages should be designed
not by piling feature on top of feature, but by
removing the weaknesses and restrictions
that make additional features appear
necessary.»
From the
SC
HEME standards
Slide 3
Slide 3 text
No content
Slide 4
Slide 4 text
No content
Slide 5
Slide 5 text
The entire language can be
built with quote, if, lambda, set!
+ variables, constants and procedure calls
Slide 6
Slide 6 text
It’s a symbolic, homoiconic
language with strong
metaprogramming features.
Slide 7
Slide 7 text
One standard, many
implementations.
Slide 8
Slide 8 text
More than 70 implementations
targeting native code, JVM, CLR,
JS, micro-CPUs, etc.
Slide 9
Slide 9 text
ABSTRACT SYNTAX TREES
Slide 10
Slide 10 text
public static int fact(int n)
{
if ( n == 0 )
return 1;
else
return n*fact(n-1);
}
Slide 11
Slide 11 text
if
==
n 0
1
n
*
fact
-
1
n
public static int fact(int n)
{
if ( n == 0 )
return 1;
else
return n*fact(n-1);
}
Slide 12
Slide 12 text
if
==
n 0
1
n
*
fact
-
1
n
public static int fact(int n)
{
if ( n == 0 )
return 1;
else
return n*fact(n-1);
}
(if (equal? n 0)
1
(* n
(fact
(- n 1))))
Slide 13
Slide 13 text
Parse AST Codegen
(if (equal? n
1
(* n
(fact
(- n 1))))
0)
Slide 14
Slide 14 text
Parse AST Codegen
(if (equal? n
1
(* n
(fact
(- n 1))))
0)
Slide 15
Slide 15 text
PROPER TAIL RECURSION
Slide 16
Slide 16 text
(if (zero? n) 1
(* n (fact (- n 1))))
Slide 17
Slide 17 text
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
Slide 18
Slide 18 text
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
Slide 19
Slide 19 text
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
if
==
n 0
1
n
*
fact
-
1
n
Slide 20
Slide 20 text
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
if
==
n 0
1
n
*
fact
-
1
n
Slide 21
Slide 21 text
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
if
==
n 0
1
n
*
fact
-
1
n
Slide 22
Slide 22 text
n
*
fact
-
1
n
Slide 23
Slide 23 text
n
*
fact
-
1
n
Slide 24
Slide 24 text
-
1
n
fact
n
*
NON-TAIL RECURSIVE
Slide 25
Slide 25 text
-
1
n
fact
n
*
acc
TAIL RECURSIVE
Slide 26
Slide 26 text
-
1
n
fact
n
*
acc
TAIL RECURSIVE
(define (fact n acc)
(if (zero? n) acc
(fact (- n 1)
(* n acc))))
Slide 27
Slide 27 text
-
1
n
fact
n
*
acc
TAIL RECURSIVE
(define (fact n acc)
(if (zero? n) acc
(fact (- n 1)
(* n acc))))
(define (fact n acc)
(if (zero? n) acc
(fact (- n 1)
(* n acc))))
(let
((name ‘‘foo’’))
(lambda (title)
(print title name)))
(let
((name ‘‘foo’’))
(lambda (title)
(print title name)))
(let
((name ‘‘foo’’))
(lambda (title)
(print title name)))
Slide 42
Slide 42 text
(let
((name ‘‘foo’’))
(lambda (title)
(print title name)))
(let
((name ‘‘foo’’))
(lambda (title)
(print title name)))
(let
((name ‘‘foo’’))
(lambda (title)
(print title name)))
Slide 43
Slide 43 text
(define send #f) ; initialize
(define recv #f)
(let ((secret-message ‘‘none’’))
(set! send (lambda (str)
(set! secret-message str)))
(set! recv (lambda ()
secret-message)))
(send ‘‘Meet me by the docks at midnight’’)
(print (recv))
Slide 44
Slide 44 text
(define send #f) ; initialize
(define recv #f)
(let ((secret-message ‘‘none’’))
(set! send (lambda (str)
(set! secret-message str)))
(set! recv (lambda ()
secret-message)))
(send ‘‘Meet me by the docks at midnight’’)
(print (recv))
Slide 45
Slide 45 text
MACROS
Slide 46
Slide 46 text
A macro is a compile-time
change in the AST.
It is used to control
evaluation.
Slide 47
Slide 47 text
(defmacro (when test do-stuff)
`(if ,test ,do-stuff))
(when #false (format-disk))
Slide 48
Slide 48 text
(define-syntax when
(syntax-rules ()
((when test code ...)
(if test (begin code ...)))))
(define-syntax when
(syntax-rules ()
((when test code ...)
(if test (begin code ...)))))
(define-syntax when
(syntax-rules ()
((when test code ...)
(if test (begin code ...)))))
(define-syntax when
(syntax-rules ()
((when test code ...)
(if test (begin code ...)))))
(define-syntax when
(syntax-rules ()
((when test code ...)
(if test (begin code ...)))))
(define-syntax when
(syntax-rules ()
((when test code ...)
(if test (begin code ...)))))