Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions demo/define-syntax-def.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
(define-library (demo define-syntax-def)
(export answer)
(begin (define answer 42)))
5 changes: 5 additions & 0 deletions demo/define-syntax-last.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
(define-library (demo define-syntax-last)
(import (demo define-syntax-next))
(begin
(display (ans))
(newline)))
6 changes: 6 additions & 0 deletions demo/define-syntax-next.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
(define-library (demo define-syntax-next)
(import (demo define-syntax-def))
(export ans)
(begin
(define (ans) (+ 0 answer))
(newline)))
58 changes: 58 additions & 0 deletions demo/x.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
(module scheme.base (let-values)
(define-syntax let-values
(lambda (x)
(syntax-case x ()
((_ ((binds exp)) b0 b1 ...)
(syntax (call-with-values (lambda () exp)
(lambda binds b0 b1 ...))))
((_ (clause ...) b0 b1 ...)
(let lp ((clauses (syntax (clause ...)))
(ids '())
(tmps '()))
(if (null? clauses)
(with-syntax (((id ...) ids)
((tmp ...) tmps))
(syntax (let ((id tmp) ...)
b0 b1 ...)))
(syntax-case (car clauses) ()
(((var ...) exp)
(with-syntax (((new-tmp ...) (generate-temporaries
(syntax (var ...))))
((id ...) ids)
((tmp ...) tmps))
(with-syntax ((inner (lp (cdr clauses)
(syntax (var ... id ...))
(syntax (new-tmp ... tmp ...)))))
(syntax (call-with-values (lambda () exp)
(lambda (new-tmp ...) inner))))))
((vars exp)
(with-syntax ((((new-var . new-tmp) ...)
(let lp ((vars (syntax vars)))
(syntax-case vars ()
((id . rest)
(acons (syntax id)
(car
(generate-temporaries (syntax (id))))
(lp (syntax rest))))
(id (acons (syntax id)
(car
(generate-temporaries (syntax (id))))
'())))))
((id ...) ids)
((tmp ...) tmps))
(with-syntax ((inner (lp (cdr clauses)
(syntax (new-var ... id ...))
(syntax (new-tmp ... tmp ...))))
(args (let lp ((tmps (syntax (new-tmp ...))))
(syntax-case tmps ()
((id) (syntax id))
((id . rest) (cons (syntax id)
(lp (syntax rest))))))))
(syntax (call-with-values (lambda () exp)
(lambda args inner))))))))))))))

(module demo ()
(import scheme.base)
(let-values (((a b) (values 1 2)))
(display b)
(newline)))
83 changes: 53 additions & 30 deletions goldfish/scheme/base.scm
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
;

(define-library (scheme base)
(import (scheme core))
(export
let-values
; R7RS 5: Program Structure
Expand Down Expand Up @@ -51,35 +52,57 @@
; 0-clause BSD
; Bill Schottstaedt
; from S7 source repo: r7rs.scm
(define-macro (let-values vars . body)
(if (and (pair? vars)
(pair? (car vars))
(null? (cdar vars)))
`((lambda ,(caar vars)
,@body)
,(cadar vars))
`(with-let
(apply sublet (curlet)
(list
,@(map
(lambda (v)
`((lambda ,(car v)
(values ,@(map (lambda (name)
(values (symbol->keyword name) name))
(let args->proper-list ((args (car v)))
(cond ((symbol? args)
(list args))
((not (pair? args))
args)
((pair? (car args))
(cons (caar args)
(args->proper-list (cdr args))))
(else
(cons (car args)
(args->proper-list (cdr args)))))))))
,(cadr v)))
vars)))
,@body)))
(define-syntax let-values
(lambda (x)
(syntax-case x ()
((_ ((binds exp)) b0 b1 ...)
(syntax (call-with-values (lambda () exp)
(lambda binds b0 b1 ...))))
((_ (clause ...) b0 b1 ...)
(let lp ((clauses (syntax (clause ...)))
(ids '())
(tmps '()))
(if (null? clauses)
(with-syntax (((id ...) ids)
((tmp ...) tmps))
(syntax (let ((id tmp) ...)
b0 b1 ...)))
(syntax-case (car clauses) ()
(((var ...) exp)
(with-syntax (((new-tmp ...) (generate-temporaries
(syntax (var ...))))
((id ...) ids)
((tmp ...) tmps))
(with-syntax ((inner (lp (cdr clauses)
(syntax (var ... id ...))
(syntax (new-tmp ... tmp ...)))))
(syntax (call-with-values (lambda () exp)
(lambda (new-tmp ...) inner))))))
((vars exp)
(with-syntax ((((new-var . new-tmp) ...)
(let lp ((vars (syntax vars)))
(syntax-case vars ()
((id . rest)
(acons (syntax id)
(car
(generate-temporaries (syntax (id))))
(lp (syntax rest))))
(id (acons (syntax id)
(car
(generate-temporaries (syntax (id))))
'())))))
((id ...) ids)
((tmp ...) tmps))
(with-syntax ((inner (lp (cdr clauses)
(syntax (new-var ... id ...))
(syntax (new-tmp ... tmp ...))))
(args (let lp ((tmps (syntax (new-tmp ...))))
(syntax-case tmps ()
((id) (syntax id))
((id . rest) (cons (syntax id)
(lp (syntax rest))))))))
(syntax (call-with-values (lambda () exp)
(lambda args inner)))))))))))))

; 0-clause BSD by Bill Schottstaedt from S7 source repo: s7test.scm
(define-macro (define-values vars expression)
Expand Down Expand Up @@ -549,7 +572,7 @@ wrong-type-arg
(close-input-port p)
(close-output-port p)))

(define (eof-object) #<eof>)
(define (eof-object) (call-with-input-string "" read))

; 0 clause BSD, from S7 repo r7rs.scm
(define list-copy copy)
Expand Down
Loading
Loading