# New Ticket Created by  Andreas Rottmann 
# Please include the string:  [perl #52556]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=52556 >


Hi!

The attached patch simplifies the generation of PAST nodes somewhat.

 compiler.scm |  299 ++++++++++++++++++++++++++---------------------------------
 1 file changed, 134 insertions(+), 165 deletions(-)

Make PAST creation terser

From: Andreas Rottmann <[EMAIL PROTECTED]>


---

 languages/eclectus/compiler.scm |  299 +++++++++++++++++----------------------
 1 files changed, 134 insertions(+), 165 deletions(-)


diff --git a/languages/eclectus/compiler.scm b/languages/eclectus/compiler.scm
index 690da46..2b25f14 100644
--- a/languages/eclectus/compiler.scm
+++ b/languages/eclectus/compiler.scm
@@ -10,6 +10,20 @@
   (set! counter (+ 1 counter))
   counter)
 
+(define (make-past-conser type)
+  (let ((type-symbol (string->symbol type)))
+    (lambda args
+      (cons type-symbol args))))
+
+(define past::op (make-past-conser "PAST::Op"))
+(define past::val (make-past-conser "PAST::Val"))
+(define past::var (make-past-conser "PAST::Var"))
+(define past::block (make-past-conser "PAST::Block"))
+(define past::stmts
+  (let ((type-symbol (string->symbol "PAST::Stmts")))
+    (lambda (stmts)
+      (cons type-symbol stmts))))
+
 ; Emit PIR that loads libs
 (define emit-init
   (lambda ()
@@ -174,110 +188,83 @@
 
 ; implementation of fxadd1
 (define-primitive (fxadd1 arg)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pirop "n_add"))
-    (emit-expr arg)
-    (emit-expr 1)))
+  (past::op '(@ (pirop "n_add"))
+            (emit-expr arg)
+            (emit-expr 1)))
 
 ; implementation of fx+
 (define-primitive (fx+ arg1 arg2)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pirop "n_add"))
-    (emit-expr arg1)
-    (emit-expr arg2)))
+  (past::op '(@ (pirop "n_add"))
+            (emit-expr arg1)
+            (emit-expr arg2)))
 
 ; implementation of fxsub1
 (define-primitive (fxsub1 arg)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pirop "n_sub"))
-    (emit-expr arg)
-    (emit-expr 1)))
+  (past::op
+        '(@ (pirop "n_sub"))
+        (emit-expr arg)
+        (emit-expr 1)))
 
 ; implementation of fx-
 (define-primitive (fx- arg1 arg2)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pirop "n_sub"))
-    (emit-expr arg1)
-    (emit-expr arg2)))
+  (past::op '(@ (pirop "n_sub"))
+            (emit-expr arg1)
+            (emit-expr arg2)))
 
 ; implementation of fxlogand
 (define-primitive (fxlogand arg1 arg2)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pirop "n_band"))
-    (emit-expr arg1)
-    (emit-expr arg2)))
+  (past::op '(@ (pirop "n_band"))
+            (emit-expr arg1)
+            (emit-expr arg2)))
 
 ; implementation of fxlogor
 (define-primitive (fxlogor arg1 arg2)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pirop "n_bor"))
-    (emit-expr arg1)
-    (emit-expr arg2)))
+  (past::op '(@ (pirop "n_bor"))
+            (emit-expr arg1)
+            (emit-expr arg2)))
 
 ; implementation of char->fixnum
 (define-primitive (char->fixnum arg)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pasttype "inline")
-                   (inline "new %r, 'EclectusFixnum'\\nassign %r, %0\\n"))
-    (emit-expr arg)))
+  (past::op '(@ (pasttype "inline")
+                (inline "new %r, 'EclectusFixnum'\\nassign %r, %0\\n"))
+            (emit-expr arg)))
 
 ; implementation of fixnum->char
 (define-primitive (fixnum->char arg)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pasttype "inline")
-                   (inline "new %r, 'EclectusCharacter'\\nassign %r, %0\\n"))
-    (emit-expr arg)))
+  (past::op '(@ (pasttype "inline")
+                (inline "new %r, 'EclectusCharacter'\\nassign %r, %0\\n"))
+            (emit-expr arg)))
 
 ; implementation of cons
 (define-primitive (cons arg1 arg2)
-  (list
-    (string->symbol "PAST::Var")
-    '(@ (viviself "EclectusPair")
-        (name "%dummy")
-        (isdecl 1)
-        (scope "lexical"))
-    (list
-      (string->symbol "PAST::Op")
-      '(@ (name "infix:,"))
-      (emit-expr arg1)
-      (emit-expr arg2))))
+  (past::var '(@ (viviself "EclectusPair")
+                 (name "%dummy")
+                 (isdecl 1)
+                 (scope "lexical"))
+             (past::op '(@ (name "infix:,"))
+                       (emit-expr arg1)
+                       (emit-expr arg2))))
 
 ; implementation of car
 (define-primitive (car arg)
-  (list
-    (string->symbol "PAST::Op")
-    '(@ (pasttype "inline")
-        (inline "%r = %0.'key'()\\n"))
-    (emit-expr arg)))
+  (past::op '(@ (pasttype "inline")
+                (inline "%r = %0.'key'()\\n"))
+            (emit-expr arg)))
 
 ; implementation of cdr
 (define-primitive (cdr arg)
-  (list
-    (string->symbol "PAST::Val")
-    '(@ (value 31)
-        (returns "EclectusFixnum"))))
+  (past::val '(@ (value 31)
+                 (returns "EclectusFixnum"))))
 
 (define emit-comparison
   (lambda (builtin arg1 arg2)
-    (list
-      (string->symbol "PAST::Op")
-      '(@ (pasttype "if"))
-      (list
-        (string->symbol "PAST::Op")
-        (quasiquote (@ (pasttype "chain")
-                       (name (unquote builtin))))
-        (emit-expr arg1)
-        (emit-expr arg2))
-      (emit-expr #t)
-      (emit-expr #f))))
+    (past::op '(@ (pasttype "if"))
+              (past::op (quasiquote (@ (pasttype "chain")
+                                       (name (unquote builtin))))
+                        (emit-expr arg1)
+                        (emit-expr arg2))
+              (emit-expr #t)
+              (emit-expr #f))))
 
 ; implementation of char<
 (define-primitive (char< arg1 arg2)
@@ -328,16 +315,14 @@
 ; asking for the type of an object
 (define emit-typequery
   (lambda (typename arg)
-    (list
-      (string->symbol "PAST::Op")
-      '(@ (pasttype "if"))
-      (list
-        (string->symbol "PAST::Op")
-        (quasiquote (@ (pasttype "inline")
-                       (inline (unquote (format "new %r, 
'EclectusBoolean'\\nisa $I1, %0, '~a'\\n %r = $I1" typename)))))
-        (emit-expr arg))
-      (emit-expr #t)
-      (emit-expr #f))))
+    (past::op
+     '(@ (pasttype "if"))
+     (past::op
+      (quasiquote (@ (pasttype "inline")
+                     (inline (unquote (format "new %r, 'EclectusBoolean'\\nisa 
$I1, %0, '~a'\\n %r = $I1" typename)))))
+      (emit-expr arg))
+     (emit-expr #t)
+     (emit-expr #f))))
    
 (define-primitive (boolean? arg)
   (emit-typequery "EclectusBoolean" arg))
@@ -380,44 +365,41 @@
 (define emit-functional-application
   (lambda (x)
     (append
-      (list  
-        (string->symbol "PAST::Op")
-        '(@ (pasttype "call"))
-        (emit-expr (car x)))
+      (past::op '(@ (pasttype "call"))
+                (emit-expr (car x)))
       (map
-        (lambda (arg)
-          (emit-expr arg))
-        (cdr x)))))
+       (lambda (arg)
+         (emit-expr arg))
+       (cdr x)))))
 
 
 ; emit PIR for a scalar
 (define emit-atom
   (lambda (x)
-    (list
-      (string->symbol (if (symbol? x) "PAST::Var" "PAST::Val"))
-      (cond
-        [(fixnum? x)
-         (quasiquote (@ (value (unquote x))
-                        (returns "EclectusFixnum")))]
-        [(char? x)
-         (quasiquote (@ (value (unquote (char->integer x)))
-                        (returns "EclectusCharacter")))]
-        [(null? x)
-         '(@ (value 0)
-             (returns "EclectusEmptyList"))]
-        [(boolean? x)
-         (quasiquote (@ (value (unquote (if x 1 0)))
-                        (returns "EclectusBoolean")))]
-        [(symbol? x)
-         (quasiquote (@ (name (unquote x))
-                        (scope "lexical")
-                        (viviself "Undef")))]
-        [(string? x)
-         (quasiquote (@ (value (unquote (format "'~a'" x)))
-                        (returns "EclectusString")))]
-        [(vector? x)
-         (quasiquote (@ (value "'#0()'")
-                        (returns "EclectusString")))]))))
+    ((if (symbol? x) past::var past::val)
+     (cond
+      [(fixnum? x)
+       (quasiquote (@ (value (unquote x))
+                      (returns "EclectusFixnum")))]
+      [(char? x)
+       (quasiquote (@ (value (unquote (char->integer x)))
+                      (returns "EclectusCharacter")))]
+      [(null? x)
+       '(@ (value 0)
+           (returns "EclectusEmptyList"))]
+      [(boolean? x)
+       (quasiquote (@ (value (unquote (if x 1 0)))
+                      (returns "EclectusBoolean")))]
+      [(symbol? x)
+       (quasiquote (@ (name (unquote x))
+                      (scope "lexical")
+                      (viviself "Undef")))]
+      [(string? x)
+       (quasiquote (@ (value (unquote (format "'~a'" x)))
+                      (returns "EclectusString")))]
+      [(vector? x)
+       (quasiquote (@ (value "'#0()'")
+                      (returns "EclectusString")))]))))
 
 (define bindings
   (lambda (x)
@@ -429,11 +411,9 @@
 
 (define emit-variable
   (lambda (x)
-    (list
-      (string->symbol "PAST::Var")
-      (quasiquote (@ (name (unquote x))
-                     (scope "lexical")
-                     (viviself "Undef"))))))
+    (past::var (quasiquote (@ (name (unquote x))
+                              (scope "lexical")
+                              (viviself "Undef"))))))
 
 (define emit-let
   (lambda (binds body)
@@ -441,56 +421,46 @@
       (emit-expr body)
       (begin
         (append
-          (cons
-            (string->symbol "PAST::Stmts")
-            (map 
-              (lambda (decl)
-                (list
-                  (string->symbol "PAST::Op")
-                  '(@ (pasttype "copy")
-                      (lvalue "1"))
-                  (list
-                    (string->symbol "PAST::Var")
-                    (quasiquote (@ (name (unquote (car decl)))
-                                   (scope "lexical")
-                                   (viviself "Undef")
-                                   (isdecl 1))))
-                  (emit-expr (cadr decl))))
-              binds))
+          (past::stmts
+           (map 
+            (lambda (decl)
+              (past::op
+               '(@ (pasttype "copy")
+                   (lvalue "1"))
+               (past::var
+                (quasiquote (@ (name (unquote (car decl)))
+                               (scope "lexical")
+                               (viviself "Undef")
+                               (isdecl 1))))
+               (emit-expr (cadr decl))))
+            binds))
           (list
-            (emit-expr body)))))))
+           (emit-expr body)))))))
 
 (define emit-if
   (lambda (x)
-    (list
-      (string->symbol "PAST::Op")
-      '(@ (pasttype "if"))
-      (emit-expr (if-test x))
-      (emit-expr (if-conseq x))
-      (emit-expr (if-altern x)))))
+    (past::op
+     '(@ (pasttype "if"))
+     (emit-expr (if-test x))
+     (emit-expr (if-conseq x))
+     (emit-expr (if-altern x)))))
 
 (define emit-lambda
   (lambda (x)  
     ; (write (list "all" x "decl" (cadr x) "stmts" (cddr x) ))(newline)
-    (list
-      (string->symbol "PAST::Block")
-      (quasiquote (@ (blocktype "declaration")
-                     (arity (unquote (length (cadr x))))))
-      (cons
-        (string->symbol "PAST::Stmts")
-        (map
-          (lambda (decl)
-            (list
-              (string->symbol "PAST::Var")
-              (quasiquote (@ (name (unquote decl))
-                             (scope "parameter")))))
-          (cadr x)))
-      (cons
-        (string->symbol "PAST::Stmts")
-        (map
-          (lambda (stmt)
-            (emit-expr stmt))
-          (cddr x))))))
+    (past::block
+     (quasiquote (@ (blocktype "declaration")
+                    (arity (unquote (length (cadr x))))))
+     (past::stmts (map
+                   (lambda (decl)
+                     (past::var
+                      (quasiquote (@ (name (unquote decl))
+                                     (scope "parameter")))))
+                   (cadr x)))
+     (past::stmts (map
+                   (lambda (stmt)
+                     (emit-expr stmt))
+                   (cddr x))))))
 
 ; emir PIR for an expression
 (define emit-expr
@@ -577,11 +547,10 @@
 ; print the result of the evaluation
 (define wrap-say
   (lambda (past)
-    (list
-      (string->symbol "PAST::Op")
-      '(@ (pasttype "call")
-          (name "say"))
-      past)))
+    (past::op
+     '(@ (pasttype "call")
+         (name "say"))
+     past)))
 
 ; the actual compiler
 (define compile-program
-- 
Andreas Rottmann         | [EMAIL PROTECTED]      | [EMAIL PROTECTED] | [EMAIL 
PROTECTED]
http://rotty.uttx.net    | GnuPG Key: http://rotty.uttx.net/gpg.asc
Fingerprint              | C38A 39C5 16D7 B69F 33A3  6993 22C8 27F7 35A9 92E7
v2sw7MYChw5pr5OFma7u7Lw2m5g/l7Di6e6t5BSb7en6g3/5HZa2Xs6MSr1/2p7 hackerkey.com

Anonymous surfing? Use Tor: http://tor.eff.net

Reply via email to