Whitespace cleanup
This commit is contained in:
parent
ec07a4e2ea
commit
337ddf8396
50
d-.scm
50
d-.scm
@ -45,8 +45,8 @@
|
|||||||
(define-syntax-rule (if-let ([ident test]) expr ...)
|
(define-syntax-rule (if-let ([ident test]) expr ...)
|
||||||
(let ([ident test])
|
(let ([ident test])
|
||||||
(if ident
|
(if ident
|
||||||
(begin expr ...)
|
(begin expr ...)
|
||||||
#f)))
|
#f)))
|
||||||
|
|
||||||
(define-syntax for
|
(define-syntax for
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
@ -54,20 +54,20 @@
|
|||||||
[(for ([ident lst] bindings ...) expr ...)
|
[(for ([ident lst] bindings ...) expr ...)
|
||||||
(let iter ([rest lst])
|
(let iter ([rest lst])
|
||||||
(if (pair? rest)
|
(if (pair? rest)
|
||||||
(let ([ident (car rest)])
|
(let ([ident (car rest)])
|
||||||
(append (for (bindings ...) expr ...) (iter (cdr rest))))
|
(append (for (bindings ...) expr ...) (iter (cdr rest))))
|
||||||
'()))]))
|
'()))]))
|
||||||
|
|
||||||
(define (partial fn . args)
|
(define (partial fn . args)
|
||||||
(lambda x (apply fn (append args x))))
|
(lambda x (apply fn (append args x))))
|
||||||
|
|
||||||
(define (argmin arg lt? . vals)
|
(define (argmin arg lt? . vals)
|
||||||
(reduce (lambda (val min)
|
(reduce (lambda (val min)
|
||||||
(if (lt? (arg val) (arg min))
|
(if (lt? (arg val) (arg min))
|
||||||
val
|
val
|
||||||
min))
|
min))
|
||||||
#f
|
#f
|
||||||
vals))
|
vals))
|
||||||
|
|
||||||
(define (iterate n f v)
|
(define (iterate n f v)
|
||||||
"Repeatedly call f on values returned from (f v)"
|
"Repeatedly call f on values returned from (f v)"
|
||||||
@ -85,16 +85,16 @@
|
|||||||
(if (null? preds)
|
(if (null? preds)
|
||||||
(lambda (x) #t)
|
(lambda (x) #t)
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(if ((car preds) x)
|
(if ((car preds) x)
|
||||||
((apply conjoin (cdr preds)) x)
|
((apply conjoin (cdr preds)) x)
|
||||||
#f))))
|
#f))))
|
||||||
|
|
||||||
(define (distinct? . a)
|
(define (distinct? . a)
|
||||||
"Are all values distinct, as in equal?"
|
"Are all values distinct, as in equal?"
|
||||||
(if (or (null? a) (null? (cdr a)))
|
(if (or (null? a) (null? (cdr a)))
|
||||||
#t
|
#t
|
||||||
(and (not (any (lambda (x) (equal? (car a) x)) (cdr a)))
|
(and (not (any (lambda (x) (equal? (car a) x)) (cdr a)))
|
||||||
(apply distinct? (cdr a)))))
|
(apply distinct? (cdr a)))))
|
||||||
|
|
||||||
;; Shamelessly ripped from https://wingolog.org/archives/2013/02/25/on-generators
|
;; Shamelessly ripped from https://wingolog.org/archives/2013/02/25/on-generators
|
||||||
(define (make-generator f)
|
(define (make-generator f)
|
||||||
@ -105,8 +105,8 @@
|
|||||||
(call-with-prompt tag
|
(call-with-prompt tag
|
||||||
thunk
|
thunk
|
||||||
(lambda (k value)
|
(lambda (k value)
|
||||||
(set! thunk k)
|
(set! thunk k)
|
||||||
value))))
|
value))))
|
||||||
|
|
||||||
(define-syntax generator
|
(define-syntax generator
|
||||||
;; generator with an anaphoric yield
|
;; generator with an anaphoric yield
|
||||||
@ -114,9 +114,9 @@
|
|||||||
(syntax-case x ()
|
(syntax-case x ()
|
||||||
[(generator expr ...)
|
[(generator expr ...)
|
||||||
(with-syntax ([yield (datum->syntax x 'yield)])
|
(with-syntax ([yield (datum->syntax x 'yield)])
|
||||||
#'(make-generator
|
#'(make-generator
|
||||||
(lambda (yield)
|
(lambda (yield)
|
||||||
expr ...)))])))
|
expr ...)))])))
|
||||||
|
|
||||||
;; Why wasn't this included?
|
;; Why wasn't this included?
|
||||||
(define macro-expand (compose tree-il->scheme macroexpand))
|
(define macro-expand (compose tree-il->scheme macroexpand))
|
||||||
@ -131,12 +131,12 @@
|
|||||||
[(amb a b ...)
|
[(amb a b ...)
|
||||||
(let ([fail0 *fail*])
|
(let ([fail0 *fail*])
|
||||||
(call/cc
|
(call/cc
|
||||||
(lambda (cc)
|
(lambda (cc)
|
||||||
(set! *fail*
|
(set! *fail*
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(set! *fail* fail0)
|
(set! *fail* fail0)
|
||||||
(cc (amb b ...))))
|
(cc (amb b ...))))
|
||||||
(cc a))))]))
|
(cc a))))]))
|
||||||
(define (amb-reset)
|
(define (amb-reset)
|
||||||
;; Shouldn't be necessary, but prompts are hard and I'm dumb dumb dummy
|
;; Shouldn't be necessary, but prompts are hard and I'm dumb dumb dummy
|
||||||
(set! *fail* (lambda () (error "Could not satisfy amb"))))
|
(set! *fail* (lambda () (error "Could not satisfy amb"))))
|
||||||
|
40
d-/test.scm
40
d-/test.scm
@ -13,25 +13,25 @@
|
|||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
(with-syntax ([fail (datum->syntax stx 'fail)])
|
(with-syntax ([fail (datum->syntax stx 'fail)])
|
||||||
(define (assert-stx expr)
|
(define (assert-stx expr)
|
||||||
(syntax-case expr (assert-equal assert-not-equal)
|
(syntax-case expr (assert-equal assert-not-equal)
|
||||||
[(assert-equal e a) #'(assert e a equal? fail)]
|
[(assert-equal e a) #'(assert e a equal? fail)]
|
||||||
[(assert-not-equal e a) #'(assert e a (compose not equal?) fail)]
|
[(assert-not-equal e a) #'(assert e a (compose not equal?) fail)]
|
||||||
[(assert-unspecified v) #'(assert (when #f 'a) v eq? fail)]
|
[(assert-unspecified v) #'(assert (when #f 'a) v eq? fail)]
|
||||||
[else #'else]))
|
[else #'else]))
|
||||||
(define (define-test-stx test)
|
(define (define-test-stx test)
|
||||||
(syntax-case test (define-test)
|
(syntax-case test (define-test)
|
||||||
[(define-test test-name e ...)
|
[(define-test test-name e ...)
|
||||||
#`(call/ec (lambda (fail)
|
#`(call/ec (lambda (fail)
|
||||||
(format #t "~a: " test-name)
|
(format #t "~a: " test-name)
|
||||||
(begin
|
(begin
|
||||||
#,@(map assert-stx #'(e ...)))
|
#,@(map assert-stx #'(e ...)))
|
||||||
(display "ok")
|
(display "ok")
|
||||||
(newline)))]))
|
(newline)))]))
|
||||||
(syntax-case stx ()
|
(syntax-case stx ()
|
||||||
[(define-test-suite name test ...)
|
[(define-test-suite name test ...)
|
||||||
#`(begin
|
#`(begin
|
||||||
(format #t "Suite ~a:" name)
|
(format #t "Suite ~a:" name)
|
||||||
(newline)
|
(newline)
|
||||||
#,@(map define-test-stx
|
#,@(map define-test-stx
|
||||||
#'(test ...))
|
#'(test ...))
|
||||||
(newline))]))))
|
(newline))]))))
|
||||||
|
32
test.scm
32
test.scm
@ -34,8 +34,8 @@
|
|||||||
(define-test-suite "for"
|
(define-test-suite "for"
|
||||||
(define-test "permutation"
|
(define-test "permutation"
|
||||||
(define value (for ([i (iota 2)]
|
(define value (for ([i (iota 2)]
|
||||||
[j (iota 2)])
|
[j (iota 2)])
|
||||||
(cons i j)))
|
(cons i j)))
|
||||||
(assert-equal '((0 . 0) (0 . 1) (1 . 0) (1 . 1)) value)))
|
(assert-equal '((0 . 0) (0 . 1) (1 . 0) (1 . 1)) value)))
|
||||||
|
|
||||||
(define-test-suite "if-let"
|
(define-test-suite "if-let"
|
||||||
@ -76,8 +76,8 @@
|
|||||||
(define number-generator
|
(define number-generator
|
||||||
(generator
|
(generator
|
||||||
(let loop ([i 1])
|
(let loop ([i 1])
|
||||||
(yield i)
|
(yield i)
|
||||||
(loop (1+ i)))))
|
(loop (1+ i)))))
|
||||||
(assert-equal 1 (number-generator))
|
(assert-equal 1 (number-generator))
|
||||||
(assert-equal 2 (number-generator))
|
(assert-equal 2 (number-generator))
|
||||||
(assert-equal 3 (number-generator))
|
(assert-equal 3 (number-generator))
|
||||||
@ -88,18 +88,18 @@
|
|||||||
(define (liars)
|
(define (liars)
|
||||||
(amb-reset)
|
(amb-reset)
|
||||||
(let ([betty (amb 1 2 3 4 5)]
|
(let ([betty (amb 1 2 3 4 5)]
|
||||||
[ethel (amb 1 2 3 4 5)]
|
[ethel (amb 1 2 3 4 5)]
|
||||||
[joan (amb 1 2 3 4 5)]
|
[joan (amb 1 2 3 4 5)]
|
||||||
[kitty (amb 1 2 3 4 5)]
|
[kitty (amb 1 2 3 4 5)]
|
||||||
[mary (amb 1 2 3 4 5)])
|
[mary (amb 1 2 3 4 5)])
|
||||||
;; The "Liars" problem
|
;; The "Liars" problem
|
||||||
(amb-require (distinct? betty ethel joan kitty mary))
|
(amb-require (distinct? betty ethel joan kitty mary))
|
||||||
(amb-require (or (= kitty 1) (= betty 3)))
|
(amb-require (or (= kitty 1) (= betty 3)))
|
||||||
(amb-require (or (= ethel 1) (= joan 2)))
|
(amb-require (or (= ethel 1) (= joan 2)))
|
||||||
(amb-require (or (= joan 3) (= ethel 5)))
|
(amb-require (or (= joan 3) (= ethel 5)))
|
||||||
(amb-require (or (= kitty 2) (= mary 4)))
|
(amb-require (or (= kitty 2) (= mary 4)))
|
||||||
(amb-require (or (= mary 4) (= betty 1)))
|
(amb-require (or (= mary 4) (= betty 1)))
|
||||||
(list betty ethel joan kitty mary)))
|
(list betty ethel joan kitty mary)))
|
||||||
(assert-equal '(3 5 2 1 4) (liars))))
|
(assert-equal '(3 5 2 1 4) (liars))))
|
||||||
|
|
||||||
(define-test-suite "json"
|
(define-test-suite "json"
|
||||||
|
Loading…
Reference in New Issue
Block a user