Error on using only to import an unexported binding.

Closes #865.
This commit is contained in:
Alex Shinn 2023-01-28 15:47:37 +09:00
parent e93b71990c
commit 598dcad547
3 changed files with 9 additions and 10 deletions

View file

@ -677,7 +677,6 @@ sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char
sexp_define_type_predicate(ctx, env, "ref?", SEXP_REF);
sexp_define_type_predicate(ctx, env, "seq?", SEXP_SEQ);
sexp_define_type_predicate(ctx, env, "lit?", SEXP_LIT);
sexp_define_type_predicate(ctx, env, "opcode?", SEXP_OPCODE);
sexp_define_type_predicate(ctx, env, "type?", SEXP_TYPE);
sexp_define_type_predicate(ctx, env, "core?", SEXP_CORE);
sexp_define_type_predicate(ctx, env, "context?", SEXP_CONTEXT);

View file

@ -26,11 +26,11 @@
seq-ls seq-ls-set! lit-value lit-value-set!
exception-kind exception-message exception-irritants exception-source
opcode-name opcode-num-params opcode-return-type opcode-param-type
opcode-class opcode-code opcode-data opcode-variadic?
opcode-class opcode-code opcode-data opcode-variadic? opcode?
macro-procedure macro-env macro-source macro-aux macro-aux-set!
procedure-code procedure-vars procedure-name procedure-name-set!
procedure-arity procedure-variadic? procedure-variable-transformer?
procedure-flags make-variable-transformer make-procedure
procedure-flags make-variable-transformer make-procedure procedure?
bytecode-name bytecode-literals bytecode-source
port-line port-line-set! port-source? port-source?-set!
extend-env env-parent env-parent-set! env-lambda env-lambda-set!

View file

@ -112,19 +112,19 @@
(if (memq (car x) '(only except rename))
(let* ((mod-name+imports (%resolve-import (cadr x)))
(imp-ids (or (cdr mod-name+imports)
(and (not (eq? 'only (car x)))
(module-exports
(find-module (car mod-name+imports)))))))
(module-exports (find-module (car mod-name+imports))))))
(cons (car mod-name+imports)
(case (car x)
((only)
(if imp-ids
(map (lambda (imp) (or (assq imp imp-ids) imp))
(cddr x))
(cddr x)))
(map (lambda (imp)
(if (or (boolean? imp-ids) (memq imp imp-ids))
imp
(error "importing unknown binding" imp imp-ids)))
(cddr x)))
((except)
(id-filter (lambda (i) (not (memq i (cddr x)))) imp-ids))
((rename)
;; TODO: warn about renaming an unimported id
(map (lambda (i)
(let ((rename (assq (to-id i) (cddr x))))
(if rename (cons (cadr rename) (from-id i)) i)))