<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Hi,</div><div><br></div><div>Sorry to disturb you again on this. I continued my experiments with “-target js”. I reimplemented quasiquote, unquote… and I stumbled on a strange bug that mystifies me: now “cons” function is not known. I have sucessfully compiled programs using cons with -target js many times but now it just won’t compile it correctly. Here is a simplified version of the code just to illustrate what I see:</div><div><br></div><div><br></div><div><div style="margin: 0px;"><div style="margin: 0px;"><font face="Monaco" size="1">; File: </font><span style="font-family: Monaco; font-size: 10px;"> Minimal-Ex1.scm</span></div><div style="margin: 0px;"><span style="font-family: Monaco; font-size: x-small;"><br></span></div><div style="margin: 0px;"><span style="font-family: Monaco; font-size: x-small;"><br></span></div><div style="margin: 0px;"><span style="font-family: Monaco; font-size: x-small;">(declare (standard-bindings)</span></div><div style="margin: 0px;"><font face="Monaco" size="1">         (extended-bindings)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">         (fixnum) (not safe))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">; include Marc's code </font></div><div style="margin: 0px;"><font face="Monaco" size="1">(include "obj2str.scm")</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">;;;</font></div><div style="margin: 0px;"><font face="Monaco" size="1">;;;; debugging utility</font></div><div style="margin: 0px;"><font face="Monaco" size="1">;;;</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (console.log x)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  ;; Note: the parameter x will be in variable Gambit_r1</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (##inline-host-statement "console.log(Gambit_r1.toString());\n"))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">;;;</font></div><div style="margin: 0px;"><font face="Monaco" size="1">;;;; list utilities I had to redefine</font></div><div style="margin: 0px;"><font face="Monaco" size="1">;;;</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (myreverse l)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (define (iter a b)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">    (if (null? a) b</font></div><div style="margin: 0px;"><font face="Monaco" size="1">      (iter (cdr a) (cons (car a) b))))</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (iter l (list)))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (iota n)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (myreverse (riota n)))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (riota n)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (if (= n 0) </font></div><div style="margin: 0px;"><font face="Monaco" size="1">      (cons 0 '())</font></div><div style="margin: 0px;"><font face="Monaco" size="1">    (cons n (riota (- n 1)))))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (foldl func accum lst)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (if (null? lst)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">      accum</font></div><div style="margin: 0px;"><font face="Monaco" size="1">      (foldl func (func accum (car lst)) (cdr lst))))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (foldr func end lst)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (if (null? lst)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">      end</font></div><div style="margin: 0px;"><font face="Monaco" size="1">      (func (car lst) (foldr func end (cdr lst)))))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (appendo . lists)</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><span class="Apple-tab-span" style="white-space:pre">        </span>(foldl append2 '() lists))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(define (append2 l1 l2)<span class="Apple-tab-span" style="white-space:pre"> </span></font></div><div style="margin: 0px;"><font face="Monaco" size="1">  (foldr cons l2 l1))</font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1"><br></font></div><div style="margin: 0px;"><font face="Monaco" size="1">(console.log (object->string (cons 1 2)))   ; OK   (1 . 2) </font></div><div style="margin: 0px;"><font face="Monaco" size="1">(console.log (object->string (iota 5)))     ; OK   (0 1 2 3 4 5)</font></div><div style="margin: 0px;"><font face="Monaco" size="1">(console.log (object->string (append2 (list 1 2 3) (list 'a 'b 'c))))  ; FAILS [Error] ReferenceError: Can't find variable: Gambit_bb1_cons</font></div><div style="font-family: Monaco; font-size: 10px;"><br></div><div style="font-family: Monaco; font-size: 10px;">—————————————————————————————————————-</div><div style="font-family: Monaco; font-size: 10px;">magnan$ gsc -c -target js  Minimal-Ex1.scm</div><div style="font-family: Monaco; font-size: 10px;"><div style="margin: 0px;">magnan$ node Minimal-Ex1.js </div><div style="margin: 0px;">(1 . 2)</div><div style="margin: 0px;">(0 1 2 3 4 5)</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">/Users/magnan/CDSCode/CDSProducts/Athena-Embedded/src/Athena-Embedded/Minimal-Ex1.js:5551</div><div style="margin: 0px;">  Gambit_r1 = (Gambit_bb1_cons);</div><div style="margin: 0px;">               ^</div><div style="margin: 0px;">ReferenceError: Gambit_bb1_cons is not defined</div></div></div></div><div><br></div><div>You see that (cons 1 2) and (iota 5) compiles well but not (append2 … ). </div><div>Can you explain this?</div><div><br></div><div>Thank you,</div><div>Francois Magnan</div><div><br></div><br><div><div>On 2013-11-18, at 16:02, Francois Magnan <<a href="mailto:magnan@categoricaldesign.com">magnan@categoricaldesign.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi Marc,<br><br>I was finally able to make a simplified version my program work when compiled to javascript but I am missing some crucial elements to complete the experiment:<br><br>1 - Variable number of parameters for functions: (define (function . args) …)<br>2 - Quasiquote, unquote and unquote-splicing<br><br>Without 1) I cannot get functions like “append” so I have a hard time trying to solve 2). <br>Can you give me hints for that or drop me an email when those features become available with the “-target js” option?<br><br>Thank you,<br>Franηois<br><br><br><br><br><br>On 2013-11-14, at 17:06, Marc Feeley <<a href="mailto:feeley@iro.umontreal.ca">feeley@iro.umontreal.ca</a>> wrote:<br><br><blockquote type="cite"><br>On Nov 14, 2013, at 4:23 PM, Francois Magnan <<a href="mailto:magnan@categoricaldesign.com">magnan@categoricaldesign.com</a>> wrote:<br><br><blockquote type="cite">By the way ##inline-host-code doesn’t seem to work anymore.<br><br>(define (console.log x)<br> ;; Note: the parameter x will be in variable Gambit_r1<br> (##inline-host-code “console.log(Gambit_r1);\n”))<br><br>How can I inline javascript code now?<br>Thank you,<br>Francois<br><br></blockquote><br>Recall that ##inline-host-code no longer exists... you have to use ##inline-host-statement and ##inline-host-expression depending on the nature of the code.  For example, this works for me using node:<br><br>(declare (extended-bindings) (not safe))<br><br>(define (show arg)<br> (##inline-host-statement "console.log(Gambit_r1.toString());"))<br><br>(show 'hello)<br><br>(show "world")<br><br>(show (##inline-host-expression "1+2+3"))<br><br>Marc<br><br></blockquote><br></blockquote></div><br></body></html>