racket/collects/honu/private/compiler/translate-utils.ss
Stevie Strickland 11a7add8bb Forgot to quote "values", and missed a use of "list".
May have to eventually make my own prefixed version of values to use,
similar to what I did with send (though honu:send does a (Honu) null object
check).

svn: r301
2005-07-03 00:58:52 +00:00

139 lines
5.8 KiB
Scheme

(module translate-utils mzscheme
(require (all-except (lib "list.ss" "srfi" "1") any)
(lib "contract.ss")
"../../ast.ss"
"../../tenv.ss")
(provide current-compile-context)
(define current-compile-context (make-parameter #f))
(define stx-for-original-property (read-syntax #f (open-input-string "original")))
(provide/contract [at ((union (syntax/c any/c) false/c)
any/c
. -> .
(syntax/c any/c))]
[at-ctxt ((syntax/c any/c) . -> . (syntax/c any/c))])
(define (at stx expr)
(datum->syntax-object (current-compile-context) expr stx stx-for-original-property))
(define (at-ctxt stx)
(datum->syntax-object (current-compile-context) (syntax-e stx) stx stx-for-original-property))
(provide void-value)
(define void-value '())
(provide translate-function)
(define (translate-function stx name args body)
(define (wrapping-syntax arg body)
(if name
(at stx `(define (,(at-ctxt name) ,arg)
(let/ec last-k ,body)))
(at stx `(lambda (,arg)
(let/ec last-k ,body)))))
(if (= (length args) 1)
(wrapping-syntax (at-ctxt (honu:formal-name (car args)))
body)
(wrapping-syntax (at #f 'arg-tuple)
`(let-values ([,(map (lambda (a)
(at-ctxt (honu:formal-name a)))
args)
(apply values ,(at #f 'arg-tuple))])
,body))))
(provide translate-binding-clause)
(define (translate-binding-clause names value)
(define (grab-indices names)
(let loop ([names names]
[n 0]
[ret '()])
(cond
[(null? names)
(reverse ret)]
[(car names)
(loop (cdr names)
(+ n 1)
(cons `(list-ref arg-tuple ,n) ret))]
[else
(loop (cdr names)
(+ n 1)
ret)])))
(values (filter (lambda (n) n) names)
`(let ([arg-tuple ,(if (= (length names) 1)
`(list* ,value ())
value)])
,(cons 'values (grab-indices names)))))
(provide translate-iface-name translate-class-name translate-method-name
translate-field-getter-name translate-field-setter-name)
(define (translate-iface-name type)
(let ([name (if (honu:type-iface-top? type)
(datum->syntax-object #f 'Any #f)
(honu:type-iface-name type))])
(at name (string->symbol (string-append (symbol->string (syntax-e name)) "<%>")))))
(define (translate-class-name class)
(at class (string->symbol (string-append (symbol->string (syntax-e class)) "%"))))
(define (translate-method-name type name)
(at name (string->symbol (string-append (symbol->string (syntax-e (translate-iface-name type)))
"-"
(symbol->string (syntax-e name))))))
(define (translate-field-getter-name type name)
(at name (string->symbol (string-append (symbol->string (syntax-e (translate-iface-name type)))
"-"
(symbol->string (syntax-e name))
"-get"))))
(define (translate-field-setter-name type name)
(at name (string->symbol (string-append (symbol->string (syntax-e (translate-iface-name type)))
"-"
(symbol->string (syntax-e name))
"-set!"))))
(provide translate-static-method translate-static-field-getter translate-static-field-setter)
(define (translate-static-method tenv arg-type name arg)
(if arg-type
(let ([type-entry (get-type-entry tenv arg-type)])
(if (s:member name
(map tenv:member-name (append (tenv:type-members type-entry)
(tenv:type-inherited type-entry)))
tenv-key=?)
(if arg
`(super ,(translate-method-name arg-type name) ,arg)
`(lambda (arg-tuple)
(super ,(translate-method-name arg-type name) arg-tuple)))
(if arg
`(,(at-ctxt name) ,arg)
(at-ctxt name))))
(if arg
`(,(at-ctxt name) ,arg)
(at-ctxt name))))
(define (translate-static-field-getter tenv arg-type name)
(if arg-type
(let ([type-entry (get-type-entry tenv arg-type)])
(if (s:member name
(map tenv:member-name (append (tenv:type-members type-entry)
(tenv:type-inherited type-entry)))
tenv-key=?)
`(super ,(translate-field-getter-name arg-type name) ,void-value)
(at-ctxt name)))
(at-ctxt name)))
(define (translate-static-field-setter tenv arg-type name arg)
(if arg-type
(let ([type-entry (get-type-entry tenv arg-type)])
(if (s:member name
(map tenv:member-name (append (tenv:type-members type-entry)
(tenv:type-inherited type-entry)))
tenv-key=?)
`(super ,(translate-field-setter-name arg-type name) ,arg)
`(begin (set! ,(at-ctxt name) ,arg)
,void-value)))
`(begin (set! ,(at-ctxt name) ,arg)
,void-value)))
)