LIPS-scheme / lips

Scheme based powerful lisp interpreter in JavaScript
https://lips.js.org
Other
413 stars 34 forks source link

SRFI-25 reference implementation doesn't run #325

Closed jcubic closed 6 months ago

jcubic commented 6 months ago

Tried to load:

(load "https://srfi.schemers.org/srfi-25/srfi-25-reference.scm")

(make-array (shape 0 4 0 4))

Got error:

Expecting number got undefined in expression `-` (argument 2)
in macro:
  ((else =>) ((case (key ...) clauses ...) (let ((atom-key (key ...))) (case atom-key clauses ...))) ((case key (else => result)) (result key)) ((case key (else result1 result2 ...)) (begin result1 result2 ...)) ((ca
se key ((atoms ...) => result)) (if (memv key (quote (atoms ...))) (result key))) ((case key ((atoms ...) => result) clause clauses ...) (if (memv key (quote (atoms ...))) (result key) (case key clause clauses ...)))
 ((case key ((atoms ...) result1 result2 ...)) (if (memv key (quote (atoms ...))) (begin result1 result2 ...))) ((case key ((atoms ...) result1 result2 ...) clause clauses ...) (if (memv key (quote (atoms ...))) (beg
in result1 result2 ...) (case key clause clauses ...))))
in macro:
  ((else =>) ((case (key ...) clauses ...) (let ((atom-key (key ...))) (case atom-key clauses ...))) ((case key (else => result)) (result key)) ((case key (else result1 result2 ...)) (begin result1 result2 ...)) ((ca
se key ((atoms ...) => result)) (if (memv key (quote (atoms ...))) (result key))) ((case key ((atoms ...) => result) clause clauses ...) (if (memv key (quote (atoms ...))) (result key) (case key clause clauses ...)))
 ((case key ((atoms ...) result1 result2 ...)) (if (memv key (quote (atoms ...))) (begin result1 result2 ...))) ((case key ((atoms ...) result1 result2 ...) clause clauses ...) (if (memv key (quote (atoms ...))) (beg
in result1 result2 ...) (case key clause clauses ...))))
in macro:
  ((else =>) ((case (key ...) clauses ...) (let ((atom-key (key ...))) (case atom-key clauses ...))) ((case key (else => result)) (result key)) ((case key (else result1 result2 ...)) (begin result1 result2 ...)) ((ca
se key ((atoms ...) => result)) (if (memv key (quote (atoms ...))) (result key))) ((case key ((atoms ...) => result) clause clauses ...) (if (memv key (quote (atoms ...))) (result key) (case key clause clauses ...)))
 ((case key ((atoms ...) result1 result2 ...)) (if (memv key (quote (atoms ...))) (begin result1 result2 ...))) ((case key ((atoms ...) result1 result2 ...) clause clauses ...) (if (memv key (quote (atoms ...))) (beg
in result1 result2 ...) (case key clause clauses ...))))

I was able to run the code only in Chicken Scheme.

Tested with:

It also works in Biwascheme after defining exact?:

(define (exact? x) (= (mod x 1) 0))
jcubic commented 6 months ago

The problem is do macro. This should evaluate to 1, but it evaluates to 0:

((do ((f (lambda () 0)
        (lambda () j))
     (j 2 (- j 1)))
    ((= j 0) f)))