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



The attached patch fixes several non-R5RS-isms and adds support for
running the testsuite with GNU Guile (tested with 1.8.4).

 MANIFEST                               |    1 
 languages/eclectus/compiler.scm        |   38 +++++++++---------------
 languages/eclectus/guile/prelude.scm   |   51 +++++++++++++++++++++++++++++++++
 languages/eclectus/t/harness           |    7 ++--
 languages/eclectus/t/learning_scheme.t |   15 +--------
 languages/eclectus/tests-driver.scm    |   12 +++----
 6 files changed, 79 insertions(+), 45 deletions(-)

Replace usage of putprop/getprop with a hash table, plus various tweaks

From: Andreas Rottmann <[EMAIL PROTECTED]>

to make the testsuite run with guile, too.
---

 MANIFEST                               |    1 +
 languages/eclectus/compiler.scm        |   38 +++++++++---------------
 languages/eclectus/guile/prelude.scm   |   51 ++++++++++++++++++++++++++++++++
 languages/eclectus/t/harness           |    7 +++-
 languages/eclectus/t/learning_scheme.t |   15 ++-------
 languages/eclectus/tests-driver.scm    |   12 ++++----
 6 files changed, 79 insertions(+), 45 deletions(-)
 create mode 100644 languages/eclectus/guile/prelude.scm


diff --git a/MANIFEST b/MANIFEST
index 3a3f8dc..32b584c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1311,6 +1311,7 @@ languages/eclectus/src/pmc/eclectuspair.pmc                 [eclectus]
 languages/eclectus/src/pmc/eclectusstring.pmc               [eclectus]
 languages/eclectus/src/pmc/eclectusvector.pmc               [eclectus]
 languages/eclectus/test-wrapper.pl                          [eclectus]
+languages/eclectus/guile/prelude.scm                        [eclectus]
 languages/eclectus/t/binary_primitives.pl                   [eclectus]
 languages/eclectus/t/binary_primitives.t                    [eclectus]
 languages/eclectus/t/booleans.pl                            [eclectus]
diff --git a/languages/eclectus/compiler.scm b/languages/eclectus/compiler.scm
index c48e662..e7eeb85 100644
--- a/languages/eclectus/compiler.scm
+++ b/languages/eclectus/compiler.scm
@@ -159,32 +159,27 @@
 
 ; Support for primitive functions
 
-; is x a primitive?
-(define primitive?
-  (lambda (x)
-    (and (symbol? x)
-         (getprop x '*is-prim*))))
+(define-record primitive (arg-count emitter))
+
+(define *primitives* (make-eq-hashtable))
+
+(define (lookup-primitive sym)
+  (hashtable-ref *primitives* sym #f))
 
 ; is x a call to a primitive? 
 (define primcall?
   (lambda (x)
-    (and (pair? x)
-         (primitive? (car x)))))
+    (and (pair? x) (lookup-primitive (car x)))))
 
-; a primitive function is a symbol with the properties
-; *is-prim*, *arg-count* and *emitter*
 ; implementatus of primitive functions are added
 ; with 'define-primitive'
 (define-syntax define-primitive
   (syntax-rules ()
     ((_ (prim-name arg* ...) b b* ...)
-     (begin
-        (putprop 'prim-name '*is-prim*
-          #t)
-        (putprop 'prim-name '*arg-count*
-          (length '(arg* ...)))
-        (putprop 'prim-name '*emitter*
-          (lambda (arg* ...) b b* ...))))))
+     (hashtable-set! *primitives*
+                     'prim-name
+                     (make-primitive (length '(arg* ...))
+                                     (lambda (arg* ...) b b* ...))))))
 
 ; implementation of fxadd1
 (define-primitive (fxadd1 arg)
@@ -319,7 +314,7 @@
      '(@ (pasttype "if"))
      (past::op
       (quasiquote (@ (pasttype "inline")
-                     (inline (unquote (format "new %r, 'EclectusBoolean'\\nisa $I1, %0, '~a'\\n %r = $I1" typename)))))
+                     (inline (unquote (format #f "new %r, 'EclectusBoolean'\\nisa $I1, %0, '~a'\\n %r = $I1" typename)))))
       (emit-expr arg))
      (emit-expr #t)
      (emit-expr #f))))
@@ -341,11 +336,6 @@
 
 
 
-; a getter of '*emitter*'
-(define primitive-emitter
-  (lambda (x)
-    (getprop x '*emitter*)))
-
 (define emit-function-header
   (lambda (function-name)
     (emit (string-append ".sub " function-name))))
@@ -359,7 +349,7 @@
 
 (define emit-primcall
   (lambda (x)
-    (let ((prim (car x)) (args (cdr x)))
+    (let ((prim (lookup-primitive (car x))) (args (cdr x)))
       (apply (primitive-emitter prim) args))))
 
 (define emit-functional-application
@@ -395,7 +385,7 @@
                       (scope "lexical")
                       (viviself "Undef"))))
       ((string? x)
-       (quasiquote (@ (value (unquote (format "'~a'" x)))
+       (quasiquote (@ (value (unquote (format #f "'~a'" x)))
                       (returns "EclectusString"))))
       ((vector? x)
        (quasiquote (@ (value "'#0()'")
diff --git a/languages/eclectus/guile/prelude.scm b/languages/eclectus/guile/prelude.scm
new file mode 100644
index 0000000..b7b750f
--- /dev/null
+++ b/languages/eclectus/guile/prelude.scm
@@ -0,0 +1,51 @@
+(use-modules (ice-9 syncase)
+             (srfi srfi-39)
+             (srfi srfi-9))
+
+(define (load filename)
+  (primitive-load filename))
+
+(define-syntax unless
+  (syntax-rules ()
+    ((unless condition body1 body ...)
+     (if (not condition)
+         (begin body1 body ...)))))
+
+(define-macro (define-record name fields)
+  (define (symbol-append . symbols)
+    (string->symbol (apply string-append (map symbol->string symbols))))
+  `(define-record-type name
+     (,(symbol-append 'make- name) ,@fields)
+     ,(symbol-append name '?)
+     ,@(map (lambda (field)
+              `(,field ,(symbol-append name '- field)))
+            fields)))
+
+(define (make-eq-hashtable)
+  (make-hash-table))
+
+(define (hashtable-ref tbl key default)
+  (hashq-ref tbl key default))
+
+(define (hashtable-set! tbl key value)
+  (hashq-set! tbl key value))
+
+(define (printf fmt . args)
+  (apply format #t fmt args))
+
+(define (fprintf port fmt . args)
+  (apply format port fmt args))
+
+(define (flush-output-port . port-opt)
+  (apply force-output port-opt))
+
+(define (open-output-file filename mode)
+  (open-file filename (case mode
+                        ((replace) "w")
+                        (else (error "invalid file mode" mode)))))
+
+(define (atom? x)
+  (not (pair? x)))
+
+(define (fixnum? x)
+  (integer? x)) ;; FIXME: This is a gross approximation
diff --git a/languages/eclectus/t/harness b/languages/eclectus/t/harness
index 27fd747..4f93a6a 100644
--- a/languages/eclectus/t/harness
+++ b/languages/eclectus/t/harness
@@ -29,9 +29,10 @@ use 5.008;
 use lib qw( ../lib ../../lib ../../lib );
 
 use Parrot::Test::Harness
-    language => 'eclectus',
-    exec     => [ 'petite', '--script' ],
-    files    => [ 't/*.pl' ];
+  language => 'eclectus',
+  exec     => [ 'petite', '--script' ],
+  #exec     => [ 'guile', '--debug', '-l', 'guile/prelude.scm', '-s' ],
+  files    => [ 't/*.pl' ];
 
 =head1 SEE ALSO
 
diff --git a/languages/eclectus/t/learning_scheme.t b/languages/eclectus/t/learning_scheme.t
index 9a7b2b7..4b82f34 100644
--- a/languages/eclectus/t/learning_scheme.t
+++ b/languages/eclectus/t/learning_scheme.t
@@ -6,25 +6,16 @@
 ; It is just a playgroud for trying out Scheme syntax
 
 ; set up TAP test plan
-(plan 17)
+(plan 15)
 
 (define test-num 1)
 (pass test-num "form definition")
 
-; object properties are something like Perl hashes
-(putprop 'parrot 'wing "feather")
-
-(define desc "getprop equals")
-(set! test-num (add1 test-num))
-(if (string=? (getprop 'parrot 'wing) "feather")       (pass test-num desc) (fail test-num desc)) 
-
-(define desc "getprop not equal")
-(set! test-num (add1 test-num))
-(if (string=? (getprop 'parrot 'wing) "not a feather") (fail test-num desc) (pass test-num desc)) 
-
 ; and
 (define desc "and")
 
+(define (add1 x) (+ x 1))
+
 (set! test-num (add1 test-num))
 ( if (and #t #t) (pass test-num desc) (fail test-num desc)) 
 
diff --git a/languages/eclectus/tests-driver.scm b/languages/eclectus/tests-driver.scm
index 43673a5..b42837e 100644
--- a/languages/eclectus/tests-driver.scm
+++ b/languages/eclectus/tests-driver.scm
@@ -40,7 +40,7 @@
                 ((null? tests) (f i ls))
                 (else
                  (test-one i (car tests) test-name)
-                 (g (add1 i) (cdr tests))))))))))
+                 (g (+ i 1) (cdr tests))))))))))
 
 (define compile-port
   (make-parameter
@@ -60,15 +60,15 @@
 
 ; TODO: can I use (directory-separator) in petite?
 (define *path-to-parrot*
-  (if (fxzero? (system "perl -e \"exit($^O eq q{MSWin32} ? 1 : 0)\""))
+  (if (zero? (system "perl -e \"exit($^O eq q{MSWin32} ? 1 : 0)\""))
     "../../parrot"
     "..\\..\\parrot"))
 
 (define (execute)
   (if run-with-petite
-    (unless (fxzero? (system "petite --script stst.scm > stst.out"))
+    (unless (zero? (system "petite --script stst.scm > stst.out"))
       (error 'execute "produced program exited abnormally"))
-    (unless (fxzero? (system (string-append *path-to-parrot* " stst.pir > stst.out")))
+    (unless (zero? (system (string-append *path-to-parrot* " stst.pir > stst.out")))
       (error 'execute "produced program exited abnormally"))))
 
 (define (get-string)
@@ -86,8 +86,8 @@
    (run-compile expr)
    (execute)
    (if (string=? expected-output (get-string))
-     (pass ( + test-id 1 ) (format "~a: ~a" test-name expr))
-     (fail ( + test-id 1 ) (format "~a: expected ~s, got ~a" test-name expr (get-string) ))))
+     (pass ( + test-id 1 ) (format #f "~a: ~a" test-name expr))
+     (fail ( + test-id 1 ) (format #f "~a: expected ~s, got ~a" test-name expr (get-string) ))))
 
 (define (emit . args)
   (apply fprintf (compile-port) args)
Regards, Rotty
-- 
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

Could Jesus microwave a burrito so hot that he himself couldn't eat it? - Homer 
S.

Reply via email to