Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afVictoria Lorenzen Redigeret for ca. et år siden
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
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.