Change declaration processing to decouple it from open blocks.
authorChris Hanson <org/chris-hanson/cph>
Tue, 30 Jan 2018 06:32:09 +0000 (22:32 -0800)
committerChris Hanson <org/chris-hanson/cph>
Tue, 30 Jan 2018 06:32:09 +0000 (22:32 -0800)
src/runtime/mit-syntax.scm
src/runtime/runtime.pkg
src/runtime/syntax-compile.scm
src/runtime/syntax-items.scm
src/runtime/syntax-output.scm
src/runtime/syntax.scm

index a27ec554c8697a83ec44f3878d2e4c3ccdd3bb0d..38ad6e38e311db3d046a965465d798caeb47ef26 100644 (file)
@@ -86,9 +86,7 @@ USA.
               (classify/body body environment))))))
 
 (define (compile-body-item item)
-  (receive (decl-items items) (extract-declarations-from-body item)
-    (output/body (map decl-item-text decl-items)
-                (compile-body-items items))))
+  (output/body (compile-body-items (item->list item))))
 
 (define (classifier:begin form environment)
   (syntax-check '(KEYWORD * FORM) form)
@@ -279,19 +277,19 @@ USA.
 (define keyword:unspecific
   (compiler->keyword
    (lambda (form environment)
-     form environment                  ;ignore
+     (declare (ignore form environment))
      (output/unspecific))))
 
 (define keyword:unassigned
   (compiler->keyword
    (lambda (form environment)
-     form environment                  ;ignore
+     (declare (ignore form environment))
      (output/unassigned))))
 \f
 ;;;; Declarations
 
 (define (classifier:declare form environment)
-  (syntax-check '(KEYWORD * (IDENTIFIER * DATUM)) form)
+  (syntax-check '(keyword * (identifier * datum)) form)
   (decl-item
    (lambda ()
      (classify/declarations (cdr form) environment))))
index e117f38cced047f10d5e0e5b10f7585515714dbe..bb0033b745c9d336bb49a80194a595f91c027e17 100644 (file)
@@ -4434,7 +4434,6 @@ USA.
          expr-item
          expr-item-compiler
          expr-item?
-         extract-declarations-from-body
          flatten-items
          item->list
          keyword-item?
@@ -4518,6 +4517,7 @@ USA.
          output/combination
          output/conditional
          output/constant
+         output/declaration
          output/definition
          output/delay
          output/disjunction
index b437d3c4b36906dfa01f13b0d1b2758a6b89f870..216c4a3139ed04d449c8c64c9274732f8fda90d5 100644 (file)
@@ -41,11 +41,8 @@ USA.
             (compile-item/expression value))))
       (compile-item/expression item)))
 
-(define (compile-body-item/top-level seq-item)
-  (receive (decl-items body-items)
-      (extract-declarations-from-body seq-item)
-    (output/top-level-sequence (map decl-item-text decl-items)
-                              (map compile-item/top-level body-items))))
+(define (compile-body-item/top-level item)
+  (output/top-level-sequence (map compile-item/top-level (item->list item))))
 
 (define (compile-body-items items)
   (let ((items (flatten-items items)))
@@ -89,10 +86,14 @@ USA.
   (lambda (item)
     (compile-body-items (seq-item-elements item))))
 
-(define (illegal-expression-compiler description)
+(define-item-compiler decl-item?
   (lambda (item)
-    (syntax-error (string description " may not be used as an expression:")
-                 item)))
+    (output/declaration (decl-item-text item))))
+
+(define (illegal-expression-compiler description)
+  (let ((message (string description " may not be used as an expression:")))
+    (lambda (item)
+      (syntax-error message item))))
 
 (define-item-compiler reserved-name-item?
   (illegal-expression-compiler "Reserved name"))
@@ -100,8 +101,5 @@ USA.
 (define-item-compiler keyword-item?
   (illegal-expression-compiler "Syntactic keyword"))
 
-(define-item-compiler decl-item?
-  (illegal-expression-compiler "Declaration"))
-
 (define-item-compiler defn-item?
   (illegal-expression-compiler "Definition"))
\ No newline at end of file
index d6d46e59b0153bd250f46b619cf4b80d14fae4d4..2f0e2e90f3a39ca9277f99fb57ca6f01ed7878ad 100644 (file)
@@ -122,16 +122,17 @@ USA.
 ;;; Sequence items.
 
 (define (seq-item elements)
-  (%seq-item (flatten-items elements)))
+  (let ((elements (flatten-items elements)))
+    (if (and (pair? elements)
+            (null? (cdr elements)))
+       (car elements)
+       (%seq-item elements))))
 
 (define-record-type <seq-item>
     (%seq-item elements)
     seq-item?
   (elements seq-item-elements))
 
-(define (extract-declarations-from-body seq-item)
-  (partition decl-item? (seq-item-elements seq-item)))
-
 (define (flatten-items items)
   (append-map item->list items))
 
index 680a7772faddb399821dfb161da475413dbc8520..58446894ca30966e1c04baca73f3b74bb758d2b9 100644 (file)
@@ -117,35 +117,22 @@ USA.
                   (output/let '() '() body)
                   body))))))))
 
-(define (output/body declarations body)
-  (scan-defines (let ((declarations (apply append declarations)))
-                 (if (pair? declarations)
-                     (make-scode-sequence
-                      (list (make-scode-block-declaration declarations)
-                            body))
-                     body))
-               make-scode-open-block))
+(define (output/body body)
+  (scan-defines body make-scode-open-block))
+
+(define (output/declaration text)
+  (make-scode-block-declaration text))
 
 (define (output/definition name value)
   (make-scode-definition name value))
 
-(define (output/top-level-sequence declarations expressions)
-  (let ((declarations (apply append declarations))
-       (make-scode-open-block
-        (lambda (expressions)
-          (scan-defines (make-scode-sequence expressions)
-                        make-scode-open-block))))
-    (if (pair? declarations)
-       (make-scode-open-block
-        (cons (make-scode-block-declaration declarations)
-              (if (pair? expressions)
-                  expressions
-                  (list (output/unspecific)))))
-       (if (pair? expressions)
-           (if (pair? (cdr expressions))
-               (make-scode-open-block expressions)
-               (car expressions))
-           (output/unspecific)))))
+(define (output/top-level-sequence expressions)
+  (if (pair? expressions)
+      (if (pair? (cdr expressions))
+         (scan-defines (make-scode-sequence expressions)
+                       make-scode-open-block)
+         (car expressions))
+      (output/unspecific)))
 
 (define (output/the-environment)
   (make-scode-the-environment))
@@ -155,7 +142,7 @@ USA.
 
 (define (output/access-assignment name environment value)
   (make-scode-combination (ucode-primitive lexical-assignment)
-                   (list environment name value)))
+                         (list environment name value)))
 
 (define (output/runtime-reference name)
   (output/access-reference name system-global-environment))
index 55b260628a4e6f7ae19590ddd568f05b514642f4..2305828aa0d16a3d30163bb76603a9154e4d8148 100644 (file)
@@ -154,11 +154,10 @@ USA.
   (let ((item-1 (lookup-identifier identifier-1 environment-1))
        (item-2 (lookup-identifier identifier-2 environment-2)))
     (or (eq? item-1 item-2)
-       ;; This is necessary because an identifier that is not
-       ;; explicitly bound by an environment is mapped to a variable
-       ;; item, and the variable items are not cached.  Therefore
-       ;; two references to the same variable result in two
-       ;; different variable items.
+       ;; This is necessary because an identifier that is not explicitly bound
+       ;; by an environment is mapped to a variable item, and the variable
+       ;; items are not hash-consed.  Therefore two references to the same
+       ;; variable result in two different variable items.
        (and (var-item? item-1)
             (var-item? item-2)
             (eq? (var-item-id item-1)