mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 13:49:17 +02:00
Support identifier-syntax in (chibi syntax-case)
This commit is contained in:
parent
d17764be29
commit
4a3c7eaf1f
4 changed files with 38 additions and 7 deletions
|
@ -98,6 +98,11 @@ sexp sexp_get_procedure_variadic_p (sexp ctx, sexp self, sexp_sint_t n, sexp pro
|
||||||
return sexp_make_boolean(sexp_procedure_variadic_p(proc));
|
return sexp_make_boolean(sexp_procedure_variadic_p(proc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sexp sexp_get_procedure_variable_transformer_p (sexp ctx, sexp self, sexp_sint_t n, sexp proc) {
|
||||||
|
sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, proc);
|
||||||
|
return sexp_make_boolean(sexp_procedure_variable_transformer_p(proc));
|
||||||
|
}
|
||||||
|
|
||||||
sexp sexp_get_procedure_flags (sexp ctx, sexp self, sexp_sint_t n, sexp proc) {
|
sexp sexp_get_procedure_flags (sexp ctx, sexp self, sexp_sint_t n, sexp proc) {
|
||||||
sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, proc);
|
sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, proc);
|
||||||
return sexp_make_fixnum(sexp_procedure_flags(proc));
|
return sexp_make_fixnum(sexp_procedure_flags(proc));
|
||||||
|
@ -694,6 +699,7 @@ sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char
|
||||||
sexp_define_foreign(ctx, env, "procedure-vars", 1, sexp_get_procedure_vars);
|
sexp_define_foreign(ctx, env, "procedure-vars", 1, sexp_get_procedure_vars);
|
||||||
sexp_define_foreign(ctx, env, "procedure-arity", 1, sexp_get_procedure_arity);
|
sexp_define_foreign(ctx, env, "procedure-arity", 1, sexp_get_procedure_arity);
|
||||||
sexp_define_foreign(ctx, env, "procedure-variadic?", 1, sexp_get_procedure_variadic_p);
|
sexp_define_foreign(ctx, env, "procedure-variadic?", 1, sexp_get_procedure_variadic_p);
|
||||||
|
sexp_define_foreign(ctx, env, "procedure-variable-transformer?", 1, sexp_get_procedure_variable_transformer_p);
|
||||||
sexp_define_foreign(ctx, env, "procedure-flags", 1, sexp_get_procedure_flags);
|
sexp_define_foreign(ctx, env, "procedure-flags", 1, sexp_get_procedure_flags);
|
||||||
sexp_define_foreign(ctx, env, "copy-lambda", 1, sexp_copy_lambda);
|
sexp_define_foreign(ctx, env, "copy-lambda", 1, sexp_copy_lambda);
|
||||||
sexp_define_foreign_opt(ctx, env, "make-lambda", 4, sexp_make_lambda_op, SEXP_NULL);
|
sexp_define_foreign_opt(ctx, env, "make-lambda", 4, sexp_make_lambda_op, SEXP_NULL);
|
||||||
|
|
|
@ -28,7 +28,8 @@
|
||||||
opcode-class opcode-code opcode-data opcode-variadic?
|
opcode-class opcode-code opcode-data opcode-variadic?
|
||||||
macro-procedure macro-env macro-source macro-aux macro-aux-set!
|
macro-procedure macro-env macro-source macro-aux macro-aux-set!
|
||||||
procedure-code procedure-vars procedure-name procedure-name-set!
|
procedure-code procedure-vars procedure-name procedure-name-set!
|
||||||
procedure-arity procedure-variadic? procedure-flags make-procedure
|
procedure-arity procedure-variadic? procedure-variable-transformer?
|
||||||
|
procedure-flags make-procedure
|
||||||
bytecode-name bytecode-literals bytecode-source
|
bytecode-name bytecode-literals bytecode-source
|
||||||
port-line port-line-set! port-source? port-source?-set!
|
port-line port-line-set! port-source? port-source?-set!
|
||||||
extend-env env-parent env-parent-set! env-lambda env-lambda-set!
|
extend-env env-parent env-parent-set! env-lambda env-lambda-set!
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
;; Written by Marc Nieper-Wißkirchen
|
;; Written by Marc Nieper-Wißkirchen
|
||||||
|
|
||||||
;; TODO: make-variable-transformer and identifier-syntax.
|
|
||||||
|
|
||||||
;; TODO: make-synthetic-identifier should return a truly unique (that
|
;; TODO: make-synthetic-identifier should return a truly unique (that
|
||||||
;; is not free-identifier=? to any other) identifier.
|
;; is not free-identifier=? to any other) identifier.
|
||||||
|
|
||||||
|
@ -16,7 +14,7 @@
|
||||||
(let ((env (or (current-usage-environment) (current-environment))))
|
(let ((env (or (current-usage-environment) (current-environment))))
|
||||||
(identifier=? env x env y)))
|
(identifier=? env x env y)))
|
||||||
|
|
||||||
(define (make-transformer transformer)
|
(define (%make-transformer transformer)
|
||||||
(cond
|
(cond
|
||||||
((and (= 1 (procedure-arity transformer))
|
((and (= 1 (procedure-arity transformer))
|
||||||
(not (procedure-variadic? transformer)))
|
(not (procedure-variadic? transformer)))
|
||||||
|
@ -40,6 +38,12 @@
|
||||||
(current-renamer old-renamer)
|
(current-renamer old-renamer)
|
||||||
result))))))
|
result))))))
|
||||||
|
|
||||||
|
(define (make-transformer base-transformer)
|
||||||
|
(let ((wrapped-transformer (%make-transformer base-transformer)))
|
||||||
|
(if (procedure-variable-transformer? base-transformer)
|
||||||
|
(make-variable-transformer wrapped-transformer)
|
||||||
|
wrapped-transformer)))
|
||||||
|
|
||||||
(%define-syntax define-syntax
|
(%define-syntax define-syntax
|
||||||
(lambda (expr use-env mac-env)
|
(lambda (expr use-env mac-env)
|
||||||
(list (close-syntax '%define-syntax mac-env)
|
(list (close-syntax '%define-syntax mac-env)
|
||||||
|
@ -377,6 +381,23 @@
|
||||||
(define-current-ellipsis ellipsis)
|
(define-current-ellipsis ellipsis)
|
||||||
. body))))))
|
. body))))))
|
||||||
|
|
||||||
|
;; identifier-syntax definition from R6RS Libraries section 12.9
|
||||||
|
(define-syntax identifier-syntax
|
||||||
|
(syntax-rules (set!)
|
||||||
|
((_ e)
|
||||||
|
(lambda (x)
|
||||||
|
(syntax-case x ()
|
||||||
|
(id (identifier? #'id) #'e)
|
||||||
|
((_ x (... ...)) #'(e x (... ...))))))
|
||||||
|
((_ (id exp1) ((set! var val) exp2))
|
||||||
|
#;(and (identifier? #'id) (identifier? #'var))
|
||||||
|
(make-variable-transformer
|
||||||
|
(lambda (x)
|
||||||
|
(syntax-case x (set!)
|
||||||
|
((set! var val) #'exp2)
|
||||||
|
((id x (... ...)) #'(exp1 x (... ...)))
|
||||||
|
(id (identifier? #'id) #'exp1)))))))
|
||||||
|
|
||||||
;; Local variables:
|
;; Local variables:
|
||||||
;; eval: (put '%define-syntax 'scheme-indent-function 1)
|
;; eval: (put '%define-syntax 'scheme-indent-function 1)
|
||||||
;; End:
|
;; End:
|
||||||
|
|
|
@ -4,14 +4,17 @@
|
||||||
datum->syntax syntax->datum
|
datum->syntax syntax->datum
|
||||||
generate-temporaries with-syntax syntax-violation
|
generate-temporaries with-syntax syntax-violation
|
||||||
with-ellipsis ellipsis-identifier?
|
with-ellipsis ellipsis-identifier?
|
||||||
define-syntax let-syntax letrec-syntax)
|
define-syntax let-syntax letrec-syntax
|
||||||
|
make-variable-transformer identifier-syntax)
|
||||||
(import (rename (chibi)
|
(import (rename (chibi)
|
||||||
(define-syntax %define-syntax)
|
(define-syntax %define-syntax)
|
||||||
(let-syntax %let-syntax)
|
(let-syntax %let-syntax)
|
||||||
(letrec-syntax %letrec-syntax))
|
(letrec-syntax %letrec-syntax)
|
||||||
|
make-variable-transformer)
|
||||||
(only (chibi ast)
|
(only (chibi ast)
|
||||||
env-cell macro? macro-aux macro-aux-set!
|
env-cell macro? macro-aux macro-aux-set!
|
||||||
procedure-arity procedure-variadic?)
|
procedure-arity procedure-variadic?
|
||||||
|
procedure-variable-transformer?)
|
||||||
(only (meta) environment)
|
(only (meta) environment)
|
||||||
(srfi 1)
|
(srfi 1)
|
||||||
(srfi 11)
|
(srfi 11)
|
||||||
|
|
Loading…
Add table
Reference in a new issue