Changeset 11915
- Timestamp:
- 05/21/09 17:14:40 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/precompiler.lisp
r11913 r11915 257 257 (symbolp (cadr callee)) 258 258 (not (special-operator-p (cadr callee))) 259 (not (macro-function (cadr callee) sys:*compile-file-environment*))259 (not (macro-function (cadr callee) *compile-file-environment*)) 260 260 (memq (symbol-package (cadr callee)) 261 261 (list (find-package "CL") (find-package "SYS")))) … … 356 356 (defvar *in-jvm-compile* nil) 357 357 358 (defvar *local-variables* nil359 "An alist with all local variables visible in the context360 of the form being preprocessed.")361 362 (declaim (ftype (function (t) t) find-varspec))363 (defun find-varspec (sym)364 (dolist (varspec *local-variables*)365 (when (eq sym (car varspec))366 (return varspec))))367 368 358 (declaim (ftype (function (t) t) precompile1)) 369 359 (defun precompile1 (form) 370 360 (cond ((symbolp form) 371 (let ((varspec (find-varspec form))) 372 (cond ((and varspec (eq (second varspec) :symbol-macro)) 373 (precompile1 (copy-tree (third varspec)))) 374 ((null varspec) 375 (let ((expansion (expand-macro form))) 376 (if (eq expansion form) 377 form 378 (precompile1 expansion)))) 379 (t 380 form)))) 361 (multiple-value-bind 362 (expansion expanded) 363 (expand-macro form) 364 (if expanded 365 (precompile1 expansion) 366 form))) 381 367 ((atom form) 382 368 form) … … 518 504 (precompile1 (expand-macro form))) 519 505 ((symbolp place) 520 (let ((varspec (find-varspec place))) 521 (if (and varspec (eq (second varspec) :symbol-macro)) 522 (precompile1 (list* 'SETF (copy-tree (third varspec)) (cddr form))) 506 (multiple-value-bind 507 (expansion expanded) 508 (expand-macro place) 509 (if expanded 510 (precompile1 (list* 'SETF expansion 511 (cddr form))) 523 512 (precompile1 (expand-macro form))))) 524 513 (t … … 533 522 (if (= len 2) 534 523 (let* ((sym (%car args)) 535 (val (%cadr args)) 536 (varspec (find-varspec sym))) 537 (if (and varspec (eq (second varspec) :symbol-macro)) 538 (precompile1 (list 'SETF (copy-tree (third varspec)) val)) 539 (list 'SETQ sym (precompile1 val)))) 524 (val (%cadr args))) 525 (multiple-value-bind 526 (expansion expanded) 527 (expand-macro sym) 528 (if expanded 529 (precompile1 (list 'SETF expansion val)) 530 (list 'SETQ sym (precompile1 val)) 531 ))) 540 532 (let ((result ())) 541 533 (loop … … 629 621 630 622 (defun precompile-symbol-macrolet (form) 631 (let ((*local-variables* *local-variables*) 632 (*compile-file-environment* 623 (let ((*compile-file-environment* 633 624 (make-environment *compile-file-environment*)) 634 625 (defs (cadr form))) … … 640 631 :format-control "Attempt to bind the special variable ~S with SYMBOL-MACROLET." 641 632 :format-arguments (list sym))) 642 (push (list sym :symbol-macro expansion) *local-variables*)643 633 (environment-add-symbol-binding *compile-file-environment* 644 634 sym … … 689 679 :format-arguments (list v))) 690 680 (push (list v (precompile1 expr)) result) 691 (push (list v :variable) *local-variables*))) 681 (environment-add-symbol-binding *compile-file-environment* 682 v nil))) ;; any value will do 692 683 (t 693 684 (push var result) 694 (push (list var :variable) *local-variables*)))) 685 (environment-add-symbol-binding *compile-file-environment* 686 var nil) 687 ))) 695 688 (nreverse result))) 696 689 697 690 (defun precompile-let (form) 698 (let ((*local-variables* *local-variables*)) 691 (let ((*compile-file-environment* 692 (make-environment *compile-file-environment*))) 699 693 (list* 'LET 700 694 (precompile-let/let*-vars (cadr form)) … … 713 707 (defun precompile-let* (form) 714 708 (setf form (maybe-fold-let* form)) 715 (let ((*local-variables* *local-variables*)) 709 (let ((*compile-file-environment* 710 (make-environment *compile-file-environment*))) 716 711 (list* 'LET* 717 712 (precompile-let/let*-vars (cadr form)) … … 857 852 (values-form (caddr form)) 858 853 (body (cdddr form)) 859 (*local-variables* *local-variables*)) 854 (*compile-file-environment* 855 (make-environment *compile-file-environment*)) 856 ) 860 857 (dolist (var vars) 861 ( push (list var :variable) *local-variables*))858 (environment-add-symbol-binding *compile-file-environment* var nil)) 862 859 (list* 'MULTIPLE-VALUE-BIND 863 860 vars … … 915 912 ;; operator, so interpreted code can use the special operator implementation. 916 913 (defun expand-macro (form) 917 (loop 918 (unless *in-jvm-compile* 919 (when (and (consp form) 920 (symbolp (%car form)) 921 (special-operator-p (%car form))) 922 (return-from expand-macro form))) 923 (multiple-value-bind (result expanded) 924 (macroexpand-1 form *compile-file-environment*) 925 (unless expanded 926 (return-from expand-macro result)) 927 (setf form result)))) 914 (let (exp) 915 (loop 916 (unless *in-jvm-compile* 917 (when (and (consp form) 918 (symbolp (%car form)) 919 (special-operator-p (%car form))) 920 (return-from expand-macro form))) 921 (multiple-value-bind (result expanded) 922 (macroexpand-1 form *compile-file-environment*) 923 (unless expanded 924 (return-from expand-macro (values result exp))) 925 (setf form result 926 exp t))))) 928 927 929 928 (declaim (ftype (function (t t) t) precompile-form))
Note: See TracChangeset
for help on using the changeset viewer.