reorganize honu. provide ellipses properly
svn: r16530
This commit is contained in:
parent
8886736b76
commit
388a2c99d4
File diff suppressed because it is too large
Load Diff
14
collects/honu/private/debug.ss
Normal file
14
collects/honu/private/debug.ss
Normal file
|
@ -0,0 +1,14 @@
|
|||
#lang scheme/base
|
||||
|
||||
(require (for-syntax scheme/base))
|
||||
|
||||
(provide debug)
|
||||
|
||||
(define-for-syntax verbose? #f)
|
||||
(define-syntax (debug stx)
|
||||
(if verbose?
|
||||
(syntax-case stx ()
|
||||
[(_ str x ...)
|
||||
#'(printf str x ...)])
|
||||
#'(void)))
|
||||
|
2118
collects/honu/private/honu.ss
Normal file
2118
collects/honu/private/honu.ss
Normal file
File diff suppressed because it is too large
Load Diff
121
collects/honu/private/macro.ss
Normal file
121
collects/honu/private/macro.ss
Normal file
|
@ -0,0 +1,121 @@
|
|||
#lang scheme/base
|
||||
|
||||
(require "honu.ss"
|
||||
(for-syntax "debug.ss")
|
||||
(for-syntax scheme/base))
|
||||
|
||||
(provide (all-defined-out))
|
||||
|
||||
(define-for-syntax (extract-conventions pattern)
|
||||
(let loop ([out '()]
|
||||
[in pattern])
|
||||
(syntax-case in (:)
|
||||
[(any : attribute rest ...)
|
||||
;; todo: export honu attributes for syntax/parse
|
||||
(loop (cons #'(any expr) out)
|
||||
#'(rest ...))
|
||||
#;
|
||||
(loop (cons #'(any attribute) out)
|
||||
#'(rest ...))]
|
||||
[(foo rest1 rest ...)
|
||||
(loop out #'(rest1 rest ...))]
|
||||
[(foo) out])))
|
||||
|
||||
(define-for-syntax (extract-patterns pattern)
|
||||
(let loop ([out '()]
|
||||
[in pattern])
|
||||
(syntax-case in (:)
|
||||
[(any : attribute rest ...)
|
||||
(loop (cons #'any out)
|
||||
#'(rest ...))]
|
||||
[(foo rest1 rest ...)
|
||||
(let ([f (if (eq? (syntax->datum #'foo) 'crackers)
|
||||
#'(... ...)
|
||||
#'foo)])
|
||||
(loop (cons f out)
|
||||
#'(rest1 rest ...)))]
|
||||
[(foo) (reverse (cons #'foo out))])))
|
||||
|
||||
(define-honu-syntax honu-macro
|
||||
(lambda (stx ctx)
|
||||
(debug "Original macro: ~a\n" (syntax->datum stx))
|
||||
(syntax-case stx (#%parens #%braces)
|
||||
[(_ (#%parens honu-literal ...)
|
||||
(#%braces (#%braces name pattern ...))
|
||||
(#%braces (#%braces template ...))
|
||||
. rest)
|
||||
(with-syntax ([(conventions ...)
|
||||
(extract-conventions #'(pattern ...))]
|
||||
[(raw-patterns ...)
|
||||
(extract-patterns #'(pattern ...))])
|
||||
(values
|
||||
(syntax/loc
|
||||
stx
|
||||
(begin
|
||||
#|
|
||||
(define honu-literal (lambda () (error 'honu-literal "cant use this")))
|
||||
...
|
||||
|#
|
||||
(define-honu-syntax name
|
||||
(lambda (stx ctx)
|
||||
(debug "Try to match against pattern ~a. Literals ~a\n" '(name raw-patterns ... . rrest) '(honu-literal ...))
|
||||
(debug "stx is ~a\n" (syntax->datum stx))
|
||||
;; (printf "head is ~a\n" (stx-car stx))
|
||||
;; (printf "= is ~a\n" =)
|
||||
(debug "my matcher ~a\n"
|
||||
(syntax-case stx (to set! do honu-end honu-literal ...)
|
||||
[(name q set! v to m do bb (... ...) honu-end) (syntax->datum #'(bb (... ...)))]
|
||||
[(name raw-patterns ...)
|
||||
'ok2]
|
||||
[(name pattern ...) 'ok5]
|
||||
[(name v (... ...) honu-literal ...) 'ok4]
|
||||
[(name v (... ...)) 'ok3]
|
||||
#;
|
||||
[(name v (... ...)) (syntax->datum #'(v (... ...)))]
|
||||
[else 'bad]))
|
||||
#;
|
||||
(debug "case pattern ~a\n"
|
||||
#'(syntax-case stx
|
||||
(honu-literal ...)
|
||||
[(name pattern ...)
|
||||
#'(honu-unparsed-block
|
||||
#f obj 'obj #f ctx
|
||||
template ...)]))
|
||||
|
||||
(let ([result (syntax-case stx
|
||||
#;
|
||||
(to set! do honu-end)
|
||||
(honu-literal ...)
|
||||
#;
|
||||
[(name q set! v to m do bb (... ...) honu-end) (syntax->datum #'(bb (... ...)))]
|
||||
[(name pattern ...) 'ok]
|
||||
[(name raw-patterns ...)
|
||||
#'(honu-unparsed-block
|
||||
#f obj 'obj #f ctx
|
||||
template ...)]
|
||||
[else 'fail-boat])])
|
||||
(debug "result was ~a\n" result))
|
||||
(syntax-case stx (honu-literal ...)
|
||||
[(name raw-patterns ... . rrest)
|
||||
(values
|
||||
#'(honu-unparsed-block
|
||||
#f obj 'obj #f ctx
|
||||
template ...)
|
||||
#'rrest)])))
|
||||
#;
|
||||
(define-honu-syntax name
|
||||
(lambda (stx ctx)
|
||||
(define-conventions honu-conventions conventions ...)
|
||||
#;
|
||||
(debug "Hello from ~a transformer. Syntax is ~a\n" 'name (syntax->datum stx))
|
||||
(syntax-parse stx
|
||||
#:literals (honu-literal ...)
|
||||
#:conventions (honu-conventions)
|
||||
[(name raw-patterns ... . rrest)
|
||||
(values
|
||||
#'(honu-unparsed-block
|
||||
#f obj 'obj #f ctx
|
||||
template ...)
|
||||
#'rrest)])))))
|
||||
#'rest))])
|
||||
))
|
Loading…
Reference in New Issue
Block a user