gambiteer on master
Add support for IBM System/390 … Merge pull request #809 from zv… (compare)
feeley on master
CI: use gcc-11 on macOS (gcc-9 … (compare)
feeley on master
Create temp dir in /tmp when no… (compare)
ReferenceError: _ScmString is not defined
suggests to me that you are linking with an outdated runtime library… make sure you have done make install
@feeley, thanks a lot for your help. The reason I was working with this example, was because I thought I could avoid the large _gambit.js library. But it is still needed.
I search this forum for hours for a working solution with a custom, minimal js runtime library, because I'm sure there was once a solution posted. I don't need all of Gambit, I think I could even sacrifice macros in order to get a smaller library. Would you mind help me with this quest for a small.js library?
rts.js
: https://gitter.im/gambit/gambit?at=5bc7fb95435c2a518ec448d1
unfortunately I get the following error:
node app.js
/gambit/app.js:503
pc = pc();
^
TypeError: pc is not a function
$ cat minimal-lib.scm
(declare (extended-bindings) (not safe))
(define (show str)
(##inline-host-statement "console.log(@scm2host@(@1@));" str))
(define (date)
(##inline-host-expression "@host2scm@(new Date())"))
(define (##run-each-module)
(let ((mods (##vector-ref ##program-descr 0)))
(let loop ((i 1)) ;; start at module after the current one
(if (##fx< i (##vector-length mods))
(let ((mod (##vector-ref mods i)))
((##vector-ref mod 4)) ;; call module's init procedure
(loop (##fx+ i 1)))))))
(##run-each-module) ;; run each module (after the current one)
$ cat minimal-app.scm
(show (date))
$ gsc -target js -c minimal-lib.scm
$ gsc -target js -l minimal-lib -exe minimal-app.scm
$ ./minimal-app
2022-06-17T13:59:21.496Z
$ gsc -v
v4.9.3 20180930122740 x86_64-unknown-linux-gnu "./configure '--prefix=/nix/store/w3pg7qf91b63yp5qr1pp3cxyfrww0hvw-gambit-4.9.3/gambit' ..."
$ gsc -h
*** WARNING -- Unknown or improperly placed -h option
this happens for many other flags, it's a clean install on nixos btw
@twoplustwo:matrix.org Take number->string
… the first parameter (a number) is required, and the second parameter is optional (a number that is the base) and you cannot pass more than 2 parameters:
> (number->string 42)
"42"
> (number->string 42 2)
"101010"
> (number->string 42 2 111 222 333)
*** ERROR IN (stdin)@3.1 -- Wrong number of arguments passed to procedure
(number->string 42 2 111 222 333)
But sometimes you want to accept any number of parameters, for example the -
procedures requires one parameter, but can have any number of additional parameters:
> (- 5)
-5
> (- 5 2)
3
> (- 5 2 1)
2
> (- 5 2 1 111 222 333)
-664
For this situation you need to define the procedure using a rest parameter which will be a list of all the remaining parameters:
> (define (- first . rest) (list 'first= first 'rest= rest))
> (- 5)
(first= 5 rest= ())
> (- 5 2 1 111 222 333)
(first= 5 rest= (2 1 111 222 333))
> (define (a x y #!optional z) (list 'x= x 'y= y 'z= z))
> (define (b x y #!optional z #!rest rest) (list 'x= x 'y= y 'z= z 'rest= rest))
> (a 1 2)
(x= 1 y= 2 z= #f)
> (a 1 2 3)
(x= 1 y= 2 z= 3)
> (a 1 2 3 4)
*** ERROR IN (stdin)@5.1 -- Wrong number of arguments passed to procedure
(a 1 2 3 4)
1> ,t
> (b 1 2)
(x= 1 y= 2 z= #f rest= ())
> (b 1 2 3)
(x= 1 y= 2 z= 3 rest= ())
> (b 1 2 3 4)
(x= 1 y= 2 z= 3 rest= (4))
> (b 1 2 3 4 5)
(x= 1 y= 2 z= 3 rest= (4 5))
(define (h1 a #!rest r #!key k) (list a k r))
is this possible?
> (define (foo x #!key y z . rest) (list 'x= x 'y= y 'z= z 'rest= rest))
> (foo 1)
(x= 1 y= #f z= #f rest= ())
> (foo 1 z: 2)
(x= 1 y= #f z= 2 rest= ())
> (foo 1 z: 2 y: 3)
(x= 1 y= 3 z= 2 rest= ())
> (foo 1 z: 2 y: 3 4)
(x= 1 y= 3 z= 2 rest= (4))
> (foo 1 z: 2 y: 3 4 5)
(x= 1 y= 3 z= 2 rest= (4 5))
(define (string-substitute str delim proc-or-alist)
(define (index-of c start)
(let loop ((i start))
(if (fx< i (string-length str))
(if (char=? c (string-ref str i))
i
(loop (fx+ i 1)))
i)))
(let loop ((i 0) (j 0) (out '()))
(let ((start (index-of delim j)))
(if (fx< start (string-length str))
(let ((end (index-of delim (fx+ start 1))))
(if (fx< end (string-length str))
(if (fx= start (fx- end 1)) ;; two delimiters in a row?
(loop (fx+ end 1)
(fx+ end 1)
(cons (substring str i end)
out))
(let* ((var
(substring str (fx+ start 1) end))
(subst
(if (procedure? proc-or-alist)
(proc-or-alist var)
(let ((x (assoc var proc-or-alist)))
(and x (cdr x))))))
(if subst
(loop (fx+ end 1)
(fx+ end 1)
(cons subst
(cons (substring str i start)
out)))
(error "Unbound substitution variable in" str))))
(error "Unbalanced delimiter in" str)))
(string-concatenate
(reverse (cons (substring str i start) out)))))))
(pp (string-substitute "@a@ plus 1 is @b@" #\@ '(("a" ."two") ("b" . "three"))))
Hello, I'm trying gambit for the first time, starting with the javascript support in 4.9.4. I am able to reproduce the instructions at
http://www.gambitscheme.org/latest/manual/#Compiling-Modules
However, if I change much from that basic scenario, stuff stops working. For example, here is my attempt to extend to importing SRFI 78:
git clone https://github.com/scheme-requests-for-implementation/srfi-78
cat srfi-78/srfi-78.sld
(define-library (srfi-78)
(import (scheme base))
(export hello-world)
(include "check.scm")
(begin
(define (hello-world)
(display "hello world\n"))
))
cat hello-test/hello-test.sld
(define-library (hello-test)
(import (srfi-78) (scheme base) (scheme write))
(begin
(display
(cond-expand
((compilation-target C) "compiled to C\n")
((compilation-target (_)) "interpreted\n")
(else "compiled to other\n")))
(hello-world)
(newline)))
gsc -target js . srfi-78 hello-test
Building module: srfi-78
gsc -target js . srfi-78
<no output>
gsc -target js . hello-test
<no output>
gsc -target js -exe -nopreload . srfi-78/srfi-78.sld hello-test/hello-test.sld
srfi-78/srfi-78.sld:
/home/jeff/srchome/src/zipper/srfi-78/srfi-78.js:
hello-test/hello-test.sld:
/home/jeff/srchome/src/zipper/hello-test/hello-test.js:
/home/jeff/srchome/src/zipper/hello-test/hello-test_.js:
hello-test/hello-test
compiled to other
*** ERROR IN hello-test# -- Operator is not a PROCEDURE
(#!void "hello world\n")