Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

(let ((title ’(Scheme Macros)) title) Syntaktiske transformationer og en masse parenteser.

Lignende præsentationer


Præsentationer af emnet: "(let ((title ’(Scheme Macros)) title) Syntaktiske transformationer og en masse parenteser."— Præsentationens transcript:

1 (let ((title ’(Scheme Macros)) title) Syntaktiske transformationer og en masse parenteser

2 (Scheme Macros) Scheme makroer har udformningen ( *) hvor er en konstant, en identifier eller en -liste eller -vektor.

3 (Scheme Macros) Standarden er givet i R 5 RS, men der findes mange udvidelser, bl.a. PLT Scheme Chez Scheme MIT/GNU Scheme …

4 (Scheme Macros) Scheme makroer defineres med (define-syntax (syntax-rules ( *) ( )*)) hvor skal være på formen ( )

5 (Scheme Macros) er som udvidet med identifier’en ” … ” ( ) binder til det, den står lige efter svarer til regulære udtryks ”*”

6 (Scheme Macros) Eksempel: (define-syntax begin (syntax-rules () ((begin e1 e2 …) ((lambda () e1 e2 …))))) (begin (display ”Hej”) (newline)) ((lambda () (display ”Hej”) (newline)))

7 (Scheme Macros) Makroer kan introducere makro-specifikke keywords Eksempel: (define-syntax my-apply (syntax-rules (with) ((my-apply f with a1 a2 …) (f a1 a2 …)) ((my-apply f a1 …) (f a1 …))))

8 (my-apply + with 1 2 3) (Scheme Macros) (+ 1 2 3)

9 (my-apply + with 1 2 3) (Scheme Macros) (+ 1 2 3) (let ((with 4)) (my-apply + with 1 2 3)) (let ((with 4)) (+ with 1 2 3) Men

10 (my-apply + with 1 2 3) (Scheme Macros) (+ 1 2 3) Makro-specifikke keywords matcher kun, hvis de begge ikke er bundne eller har samme leksikale binding (let ((with 4)) (my-apply + with 1 2 3)) (let ((with 4)) (+ with 1 2 3) Men

11 Hygiejnisk ekspansion: JA (Scheme Macros) (define-syntax variable-use (syntax-rules () ((variable-use) m))) (let ((m 2)) (variable-use)) Reference to undefined identifier: m (define m 1) (define-syntax variable-use (syntax-rules () ((variable-use) m))) (let ((m 2)) (variable-use)) 1

12 Rekursion: Ja (Scheme Macros) (define-syntax letstar (syntax-rules () ((letstar ((name val)) e1 e2 …) ((lambda (name) e1 e2 …) val)) ((letstar ((name val) r …) e …) ((lambda (name) (letstar (r …) e …)) val))))

13 (Scheme Macros) (letstar ((x 1) (y 2) (r (+ x y))) r) ((lambda (x) ((lambda (y) ((lambda (r) r) (+ x y))) 2)) 1)

14 Ekspansionsorden: Outer Kropsekspansion: Lazy (Scheme Macros) (define-syntax plus (syntax-rules () ((plus e1 e2 …) (+ e1 e2 …)))) (define-syntax macro-if (syntax-rules (true false) ((macro-if true m1 m2) m1) ((macro-if false m1 m2) m2))) (macro-if true (plus 1) (plus)) (+ 1) (macro-if false (plus 1) (plus)) Bad syntax in (plus)

15 Multiple definitioner: nej – gendefinerer makroen (Scheme Macros) (define-syntax macro-if (syntax-rules (true) ((macro-if true m1 m2) m1))) (define-syntax macro-if (syntax-rules (false) ((macro-if false m1 m2) m2))) (macro-if true (plus 1) (plus 2)) Bad syntax in macro-if

16 Makroer som resultat: Ja (Scheme Macros) (define-syntax macro-definer (syntax-rules () ((macro-definer name rules) (define-syntax name rules)))) (macro-definer when (syntax-rules () ((when pred then) (if pred then)))) (when (= 1 2) (explode))

17 Garanteret terminering: nej (Scheme Macros) (define-syntax loop (syntax-rules () ((loop) (loop)))) (loop)

18 Garanteret terminering: nej (Scheme Macros) (define-syntax loop (syntax-rules () ((loop) (loop)))) (loop) Garanteres aldrig at terminere pga. tail recursion

19 Programmerbare: Ja (Scheme Macros)

20 (define-syntax define-record (syntax-rules () ((define-record name id...) (let* ((constructor-name (string->symbol (string-append "make-" (symbol->string 'name)))) (predicate-name (string->symbol (string-append "is-" (symbol->string 'name) "?"))) (id-list '(id...)) (record-length (+ (length id-list) 1))) (eval `(begin (define,constructor-name (lambda,id-list (vector 'name id...))) (define,predicate-name (lambda (x) (and (vector? x) (= (vector-length x),record-length) (eq? (vector-ref x 0) 'name)))))))))) Programmerbarhed gennem eval-funktionen:

21 (define-syntax test (let ((m #t)) (begin (display `(Test with,m)) (if m (syntax-rules () ((test) 100)) (syntax-rules () ((test) 200)))))) Direkte programmering: Dog kraftigt begrænset af, at scope er internt, dvs. (define m #t) (define-syntax test (if m (syntax-rules () ((test) 100)) (syntax-rules () ((test) 200)))) Reference to undefined identifier: m

22 (Scheme Macros) Opsummering: Level of operation: Language dependent: Programmable: Definition keywords: Invocation syntax: Multiple definitions: Recursion: Body expansion: Order of expansion: Hygienic expansion: Macros as results: Guaranteed termination: Syntactical Yes Yes define-syntax, let-syntax, letrec-syntax ( _ _ _) No Yes Lazy Outer Yes Yes No


Download ppt "(let ((title ’(Scheme Macros)) title) Syntaktiske transformationer og en masse parenteser."

Lignende præsentationer


Annoncer fra Google