Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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) (+ 1 answer))
(newline)))
5 changes: 5 additions & 0 deletions demo/demo_psyntax.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
(define-library (demo demo_psyntax)
(import (scheme base))
(begin
(display (max 10 11))))

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)))
4 changes: 3 additions & 1 deletion goldfish/liii/base.scm
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@
; R7RS 6.7: String
string-copy
; R7RS 6.8 Vector
vector->string string->vector vector-copy vector-copy! vector-fill! vector-append
vector->string string->vector vector-copy vector-copy! vector-fill!
; workaround for binding s7 primitives
(rename vector-append vector-append)
; R7RS 6.9 Bytevectors
bytevector? make-bytevector bytevector bytevector-length bytevector-u8-ref
bytevector-u8-set! bytevector-copy bytevector-append
Expand Down
145 changes: 113 additions & 32 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 internal))
(export
let-values
; R7RS 5: Program Structure
Expand All @@ -26,7 +27,7 @@
; R7RS 6.4: list
pair? cons car cdr set-car! set-cdr! caar cadr cdar cddr
null? list? make-list list length append reverse list-tail
list-ref list-set! memq memv member assq assv assoc list-copy
list-ref list-set! memq memv member assq assv assoc (rename copy list-copy)
; R7RS 6.5: Symbol
symbol? symbol=? string->symbol symbol->string
; R7RS 6.6: Characters
Expand All @@ -51,40 +52,120 @@
; 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)
`(if (not (null? ',vars))
(varlet (curlet) ((lambda ,vars (curlet)) ,expression))))
; (define-syntax define-values
; (lambda (orig-form)
; (syntax-case orig-form ()
; ((_ () expr)
; ;; XXX Work around the lack of hygienic top-level identifiers
; (with-syntax (((dummy) (generate-temporaries '(dummy))))
; #`(define dummy
; (call-with-values (lambda () expr)
; (lambda () #f)))))
; ((_ (var) expr)
; (identifier? #'var)
; #`(define var
; (call-with-values (lambda () expr)
; (lambda (v) v))))
; ((_ (var0 ... varn) expr)
; (and-map identifier? #'(var0 ... varn))
; ;; XXX Work around the lack of hygienic toplevel identifiers
; (with-syntax (((dummy) (generate-temporaries '(dummy))))
; #`(begin
; ;; Avoid mutating the user-visible variables
; (define dummy
; (call-with-values (lambda () expr)
; (lambda (var0 ... varn)
; (list var0 ... varn))))
; (define var0
; (let ((v (car dummy)))
; (set! dummy (cdr dummy))
; v))
; ...
; (define varn
; (let ((v (car dummy)))
; (set! dummy #f) ; blackhole dummy
; v)))))
; ((_ var expr)
; (identifier? #'var)
; #'(define var
; (call-with-values (lambda () expr)
; list)))
; ((_ (var0 ... . varn) expr)
; (and-map identifier? #'(var0 ... varn))
; ;; XXX Work around the lack of hygienic toplevel identifiers
; (with-syntax (((dummy) (generate-temporaries '(dummy))))
; #`(begin
; ;; Avoid mutating the user-visible variables
; (define dummy
; (call-with-values (lambda () expr)
; (lambda (var0 ... . varn)
; (list var0 ... varn))))
; (define var0
; (let ((v (car dummy)))
; (set! dummy (cdr dummy))
; v))
; ...
; (define varn
; (let ((v (car dummy)))
; (set! dummy #f) ; blackhole dummy
; v))))))))


; 0-clause BSD by Bill Schottstaedt from S7 source repo: r7rs.scm
(define-macro (define-record-type type make ? . fields)
Expand Down Expand Up @@ -549,10 +630,10 @@ 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)
; (define list-copy copy)

(define (string-copy str . start_end)
(cond ((null? start_end)
Expand Down
Loading