Hello from Gambits Universal (Javascript) Backend

by ben@srctxt.com

November 12, 2019


Gambit is a Scheme implementation by Marc Feeley. It primarely compiles to c, but can also compile to other targets by its Universal Backend.

In July 2019 Marc posted an example on the mailing list under the following link: https://mailman.iro.umontreal.ca/pipermail/gambit-list/2019-July/009103.html

This link is cited often, so this here is basically just a backup of this article.

A few months later I had some trouble running its initial example, which turned out later, was due some minor changes in some on declaration sections. His comments can be found here: https://mailman.iro.umontreal.ca/pipermail/gambit-list/2019-November/009240.html



;; file: lib.scm

;(declare (standard-bindings) (extended-bindings) (not safe) (not run-time-bindings))

(declare (standard-bindings) (extended-bindings) (not safe) (not run-time-bindings))
(declare (not standard-bindings append for-each))

(println ">>> lib.scm")

(define (for-each f lst)
  (if (pair? lst)
        (f (car lst))
        (for-each f (cdr lst)))))

(define (append lst1 lst2)
  (if (pair? lst1)
      (cons (car lst1) (append (cdr lst1) lst2))

(define (current-milliseconds)
  (##inline-host-expression "Date.now()"))

(define (js-alert obj)
  (##inline-host-statement "console.log(g_scm2host(@1@));" obj))

(app#) ;; execute app.scm module


;; file: app.scm

(declare (standard-bindings) (extended-bindings) (not safe) (not run-time-bindings))
(declare (not standard-bindings append for-each))

(println ">>> app.scm")

(define (fib n) (if (fx< n 2) n (fx+ (fib (fx- n 1)) (fib (fx- n 2)))))

 (lambda (x)
   (println (fib x)))
 (append '(1 2 3)
         '(4 5 6)))

(let* ((start (current-milliseconds))
       (result (fib 35))
       (end (current-milliseconds)))
  (js-alert (fx- end start))
  (js-alert result))


GSC=../gsc/gsc -:=.. -target js
GSC=gsc -target js

all: run

lib.js: lib.scm
    $(GSC) -c lib.scm

app.js: app.scm
    $(GSC) -c app.scm

app_.js: lib.js app.js
    $(GSC) -link -l lib app.js

linked_app.js: lib.js app.js app_.js
    $(GSC) -c lib.scm
    cat app_.js lib.js app.js > linked_app.js
    wc *.js

run: linked_app.js
    node linked_app.js

    rm -f lib.js app.js app_.js linked_app.js

id: 20191112hcus-bt (72a100, 2019/91a10)