mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-21 06:39:17 +02:00
merge
This commit is contained in:
commit
9b85812f4a
8 changed files with 4528 additions and 0 deletions
46
benchmarks/shootout/binarytrees.chibi
Executable file
46
benchmarks/shootout/binarytrees.chibi
Executable file
|
@ -0,0 +1,46 @@
|
||||||
|
#! /usr/bin/env chibi-scheme
|
||||||
|
|
||||||
|
;;; The Computer Language Benchmarks Game
|
||||||
|
;;; http://shootout.alioth.debian.org/
|
||||||
|
|
||||||
|
(import (srfi 9))
|
||||||
|
|
||||||
|
(define-record-type node
|
||||||
|
(make-node value left right)
|
||||||
|
node?
|
||||||
|
(value node-value node-value-set!)
|
||||||
|
(left node-left node-left-set!)
|
||||||
|
(right node-right node-right-set!))
|
||||||
|
|
||||||
|
(define (make value depth)
|
||||||
|
(if (zero? depth)
|
||||||
|
(make-node value #f #f)
|
||||||
|
(let ((v (* value 2))
|
||||||
|
(d (- depth 1)))
|
||||||
|
(make-node value (make (- v 1) d) (make v d)))))
|
||||||
|
|
||||||
|
(define (check n)
|
||||||
|
(if n
|
||||||
|
(+ (node-value n) (- (check (node-left n)) (check (node-right n))))
|
||||||
|
0))
|
||||||
|
|
||||||
|
(define (print . args) (for-each display args) (newline))
|
||||||
|
|
||||||
|
(define (main args)
|
||||||
|
(let* ((n (string->number (car args)))
|
||||||
|
(min-depth 4)
|
||||||
|
(max-depth (max (+ min-depth 2) n))
|
||||||
|
(stretch-depth (+ max-depth 1)))
|
||||||
|
(print "stretch tree of depth " stretch-depth "\t check: "
|
||||||
|
(check (make 0 stretch-depth)))
|
||||||
|
(let ((long-lived-tree (make 0 max-depth)))
|
||||||
|
(do ((d min-depth (+ d 2)))
|
||||||
|
((>= d max-depth))
|
||||||
|
(let ((iterations (* 2 (+ (- max-depth d) min-depth))))
|
||||||
|
(print (* 2 iterations) "\t trees of depth " d "\t check: "
|
||||||
|
(do ((i 0 (+ i 1))
|
||||||
|
(c 0 (+ c (check (make i d)) (check (make (- i) d)))))
|
||||||
|
((>= i iterations)
|
||||||
|
c)))))
|
||||||
|
(print "long lived tree of depth " max-depth "\t check: "
|
||||||
|
(check long-lived-tree)))))
|
106
benchmarks/shootout/chameneos-redux.chibi
Normal file
106
benchmarks/shootout/chameneos-redux.chibi
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#! /usr/bin/env chibi-scheme
|
||||||
|
|
||||||
|
;;; The Computer Language Benchmarks Game
|
||||||
|
;;; http://shootout.alioth.debian.org/
|
||||||
|
|
||||||
|
;;; based on Racket version by Matthew Flatt
|
||||||
|
|
||||||
|
(import (srfi 18)
|
||||||
|
(chibi match))
|
||||||
|
|
||||||
|
(define (print . args)
|
||||||
|
(for-each display args)
|
||||||
|
(newline))
|
||||||
|
|
||||||
|
(define (change c1 c2)
|
||||||
|
(case c1
|
||||||
|
((red)
|
||||||
|
(case c2 ((blue) 'yellow) ((yellow) 'blue) (else c1)))
|
||||||
|
((yellow)
|
||||||
|
(case c2 ((blue) 'red) ((red) 'blue) (else c1)))
|
||||||
|
((blue)
|
||||||
|
(case c2 ((yellow) 'red) ((red) 'yellow) (else c1)))))
|
||||||
|
|
||||||
|
(let ((colors '(blue red yellow)))
|
||||||
|
(for-each
|
||||||
|
(lambda (a)
|
||||||
|
(for-each
|
||||||
|
(lambda (b)
|
||||||
|
(print a " + " b " -> " (change a b)))
|
||||||
|
colors))
|
||||||
|
colors))
|
||||||
|
|
||||||
|
(define (place meeting-ch n)
|
||||||
|
(thread-start!
|
||||||
|
(make-thread
|
||||||
|
(lambda ()
|
||||||
|
(let loop ((n n))
|
||||||
|
(if (<= n 0)
|
||||||
|
;; Fade all:
|
||||||
|
(let loop ()
|
||||||
|
(let ((c (channel-get meeting-ch)))
|
||||||
|
(channel-put (car c) #f)
|
||||||
|
(loop)))
|
||||||
|
;; Let two meet:
|
||||||
|
(match-let (((ch1 . v1) (channel-get meeting-ch))
|
||||||
|
((ch2 . v2) (channel-get meeting-ch)))
|
||||||
|
(channel-put ch1 v2)
|
||||||
|
(channel-put ch2 v1)
|
||||||
|
(loop (- n 1)))))))))
|
||||||
|
|
||||||
|
(define (creature color meeting-ch result-ch)
|
||||||
|
(thread-start!
|
||||||
|
(make-thread
|
||||||
|
(lambda ()
|
||||||
|
(let ((ch (make-channel))
|
||||||
|
(name (gensym)))
|
||||||
|
(let loop ((color color) (met 0) (same 0))
|
||||||
|
(channel-put meeting-ch (cons ch (cons color name)))
|
||||||
|
(match (channel-get ch)
|
||||||
|
((other-color . other-name)
|
||||||
|
;; Meet:
|
||||||
|
(sleep) ; avoid imbalance from weak fairness
|
||||||
|
(loop (change color other-color)
|
||||||
|
(add1 met)
|
||||||
|
(+ same (if (eq? name other-name)
|
||||||
|
1
|
||||||
|
0))))
|
||||||
|
(#f
|
||||||
|
;; Done:
|
||||||
|
(channel-put result-ch (cons met same))))))))))
|
||||||
|
|
||||||
|
(define (spell n)
|
||||||
|
(for-each
|
||||||
|
(lambda (i)
|
||||||
|
(display " ")
|
||||||
|
(display (vector-ref digits (- (char->integer i) (char->integer #\0)))))
|
||||||
|
(string->list (number->string n))))
|
||||||
|
|
||||||
|
(define digits
|
||||||
|
'#("zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine"))
|
||||||
|
|
||||||
|
(define (go n inits)
|
||||||
|
(let ((result-ch (make-channel))
|
||||||
|
(meeting-ch (make-channel)))
|
||||||
|
(place meeting-ch n)
|
||||||
|
(newline)
|
||||||
|
(for-each
|
||||||
|
(lambda (init)
|
||||||
|
(print " " init)
|
||||||
|
(creature init meeting-ch result-ch))
|
||||||
|
inits)
|
||||||
|
(newline)
|
||||||
|
(let ((results (map (lambda (i) (channel-get result-ch)) inits)))
|
||||||
|
(for-each
|
||||||
|
(lambda (r)
|
||||||
|
(display (car r))
|
||||||
|
(spell (cdr r))
|
||||||
|
(newline))
|
||||||
|
results)
|
||||||
|
(spell (apply + (map car results)))
|
||||||
|
(newline))))
|
||||||
|
|
||||||
|
(let ((n (command-line #:args (n) (string->number n))))
|
||||||
|
(go n '(blue red yellow))
|
||||||
|
(go n '(blue red yellow red yellow blue red yellow red blue))
|
||||||
|
(newline))
|
4171
benchmarks/shootout/knucleotide-input.txt
Normal file
4171
benchmarks/shootout/knucleotide-input.txt
Normal file
File diff suppressed because it is too large
Load diff
27
benchmarks/shootout/knucleotide-output.txt
Normal file
27
benchmarks/shootout/knucleotide-output.txt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
A 30.279
|
||||||
|
T 30.113
|
||||||
|
G 19.835
|
||||||
|
C 19.773
|
||||||
|
|
||||||
|
AA 9.161
|
||||||
|
AT 9.138
|
||||||
|
TA 9.108
|
||||||
|
TT 9.060
|
||||||
|
CA 6.014
|
||||||
|
GA 5.996
|
||||||
|
AG 5.993
|
||||||
|
AC 5.988
|
||||||
|
TG 5.987
|
||||||
|
GT 5.967
|
||||||
|
TC 5.958
|
||||||
|
CT 5.948
|
||||||
|
GG 3.944
|
||||||
|
GC 3.928
|
||||||
|
CG 3.910
|
||||||
|
CC 3.899
|
||||||
|
|
||||||
|
1474 GGT
|
||||||
|
459 GGTA
|
||||||
|
49 GGTATT
|
||||||
|
1 GGTATTTTAATT
|
||||||
|
1 GGTATTTTAATTTATAGT
|
85
benchmarks/shootout/knucleotide.chibi
Normal file
85
benchmarks/shootout/knucleotide.chibi
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
#! /usr/bin/env chibi-scheme
|
||||||
|
|
||||||
|
;;; The Computer Language Benchmarks Game
|
||||||
|
;;; http://shootout.alioth.debian.org/
|
||||||
|
|
||||||
|
;;; based on Racket version by Matthew Flatt
|
||||||
|
|
||||||
|
(import (srfi 69)
|
||||||
|
(srfi 95)
|
||||||
|
(chibi io))
|
||||||
|
|
||||||
|
(define (print . args)
|
||||||
|
(for-each display args)
|
||||||
|
(newline))
|
||||||
|
|
||||||
|
(define (string-copy! dst dstart src start end)
|
||||||
|
(do ((i dstart (+ i 1))
|
||||||
|
(j start (+ j 1)))
|
||||||
|
((>= j end))
|
||||||
|
(string-set! dst i (string-ref src j))))
|
||||||
|
|
||||||
|
(define (string-upcase str)
|
||||||
|
(let* ((len (string-length str))
|
||||||
|
(res (make-string len)))
|
||||||
|
(do ((i 0 (+ i 1)))
|
||||||
|
((>= i len) res)
|
||||||
|
(string-set! res i (char-upcase (string-ref str i))))))
|
||||||
|
|
||||||
|
(define (all-counts len dna)
|
||||||
|
(let ((table (make-hash-table eq?))
|
||||||
|
(seq (make-string len)))
|
||||||
|
(do ((s (- (string-length dna) len) ( - s 1)))
|
||||||
|
((< s 0) table)
|
||||||
|
(string-copy! seq 0 dna s (+ s len))
|
||||||
|
(let ((key (string->symbol seq)))
|
||||||
|
(let ((cnt (hash-table-ref/default table key 0)))
|
||||||
|
(hash-table-set! table key (+ cnt 1)))))))
|
||||||
|
|
||||||
|
(define (write-freqs table)
|
||||||
|
(let* ((content (hash-table->alist table))
|
||||||
|
(total (exact->inexact (apply + (map cdr content)))))
|
||||||
|
(for-each
|
||||||
|
(lambda (a)
|
||||||
|
(print (car a) " "
|
||||||
|
(/ (round (* 100000.0 (/ (cdr a) total))) 1000.0)))
|
||||||
|
(sort content > cdr))))
|
||||||
|
|
||||||
|
(define (write-one-freq table key)
|
||||||
|
(print (hash-table-ref/default table key 0) "\t" key))
|
||||||
|
|
||||||
|
(define dna
|
||||||
|
(let ((in (current-input-port)))
|
||||||
|
;; Skip to ">THREE ..."
|
||||||
|
(let lp ()
|
||||||
|
(let ((line (read-line in)))
|
||||||
|
(cond ((eof-object? line))
|
||||||
|
((and (>= (string-length line) 6)
|
||||||
|
(eqv? #\> (string-ref line 0))
|
||||||
|
(equal? (substring line 0 6) ">THREE")))
|
||||||
|
(else (lp)))))
|
||||||
|
(let ((out (open-output-string)))
|
||||||
|
;; Copy everything but newlines to out:
|
||||||
|
(let lp ()
|
||||||
|
(let ((line (read-line in)))
|
||||||
|
(cond ((eof-object? line))
|
||||||
|
(else
|
||||||
|
(display line out)
|
||||||
|
(lp)))))
|
||||||
|
;; Extract the string from out:
|
||||||
|
(string-upcase (get-output-string out)))))
|
||||||
|
|
||||||
|
;; 1-nucleotide counts:
|
||||||
|
(write-freqs (all-counts 1 dna))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
;; 2-nucleotide counts:
|
||||||
|
(write-freqs (all-counts 2 dna))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
;; Specific sequences:
|
||||||
|
(for-each
|
||||||
|
(lambda (seq)
|
||||||
|
(write-one-freq (all-counts (string-length seq) dna)
|
||||||
|
(string->symbol seq)))
|
||||||
|
'("GGT" "GGTA" "GGTATT" "GGTATTTTAATT" "GGTATTTTAATTTATAGT"))
|
5
lib/chibi/generic.module
Normal file
5
lib/chibi/generic.module
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
(define-module (chibi generic)
|
||||||
|
(export define-generic define-method make-generic generic-add!)
|
||||||
|
(import-immutable (scheme))
|
||||||
|
(include "generic.scm"))
|
79
lib/chibi/generic.scm
Normal file
79
lib/chibi/generic.scm
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
|
||||||
|
(define-syntax define-generic
|
||||||
|
(syntax-rules ()
|
||||||
|
((define-generic name)
|
||||||
|
(define name (make-generic 'name)))))
|
||||||
|
|
||||||
|
'(define-syntax define-method
|
||||||
|
(syntax-rules ()
|
||||||
|
((define-method (name (param type) ...) . body)
|
||||||
|
(generic-add! name
|
||||||
|
(list type ...)
|
||||||
|
(lambda (next param ...)
|
||||||
|
(let-syntax ((call))
|
||||||
|
. body))))))
|
||||||
|
|
||||||
|
(define-syntax define-method
|
||||||
|
(er-macro-transformer
|
||||||
|
(lambda (e r c)
|
||||||
|
(let ((name (caadr e))
|
||||||
|
(params (cdadr e))
|
||||||
|
(body (cddr e)))
|
||||||
|
`(,(r 'generic-add!) ,name
|
||||||
|
(,(r 'list) ,@(map cadr params))
|
||||||
|
(,(r 'lambda) (next ,@(map car params))
|
||||||
|
(,(r 'let-syntax) ((call-next-method
|
||||||
|
(,(r 'syntax-rules) ()
|
||||||
|
((_) (next)))))
|
||||||
|
,@body)))))))
|
||||||
|
|
||||||
|
(define (no-applicable-method-error name args)
|
||||||
|
(error "no applicable method" name args))
|
||||||
|
|
||||||
|
(define (satisfied? preds args)
|
||||||
|
(cond ((null? preds) (null? args))
|
||||||
|
((null? args) #f)
|
||||||
|
(((car preds) (car args)) (satisfied? (cdr preds) (cdr args)))
|
||||||
|
(else #f)))
|
||||||
|
|
||||||
|
(define add-method-tag (list 'add-method-tag))
|
||||||
|
|
||||||
|
(define (make-generic name)
|
||||||
|
(let ((name name)
|
||||||
|
(methods (make-vector 6 '())))
|
||||||
|
(vector-set! methods
|
||||||
|
3
|
||||||
|
(list (cons (list (lambda (x) (eq? x add-method-tag))
|
||||||
|
(lambda (x) (list? x))
|
||||||
|
procedure?)
|
||||||
|
(lambda (next t p f)
|
||||||
|
(set! methods (insert-method! methods p f))))))
|
||||||
|
(lambda args
|
||||||
|
(let ((len (length args)))
|
||||||
|
(cond
|
||||||
|
((>= len (vector-length methods))
|
||||||
|
(no-applicable-method-error name args))
|
||||||
|
(else
|
||||||
|
(let lp ((ls (vector-ref methods len)))
|
||||||
|
(cond
|
||||||
|
((null? ls)
|
||||||
|
(no-applicable-method-error name args))
|
||||||
|
((satisfied? (car (car ls)) args)
|
||||||
|
(apply (cdr (car ls)) (lambda () (lp (cdr ls))) args))
|
||||||
|
(else
|
||||||
|
(lp (cdr ls)))))))))))
|
||||||
|
|
||||||
|
(define (insert-method! vec preds f)
|
||||||
|
(let ((vlen (vector-length vec))
|
||||||
|
(plen (length preds)))
|
||||||
|
(let ((res (if (>= plen vlen)
|
||||||
|
(let ((r (make-vector (+ vlen 1) '())))
|
||||||
|
(do ((i 0 (+ i 1)))
|
||||||
|
((>= i vlen) r)
|
||||||
|
(vector-set! r i (vector-ref vec i))))
|
||||||
|
vec)))
|
||||||
|
(vector-set! res plen (cons (cons preds f) (vector-ref res plen)))
|
||||||
|
res)))
|
||||||
|
|
||||||
|
(define (generic-add! g preds f)
|
||||||
|
(g add-method-tag preds f))
|
9
lib/srfi/55.module
Normal file
9
lib/srfi/55.module
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
|
||||||
|
(define-module (srfi 55)
|
||||||
|
(export require-extension)
|
||||||
|
(import-immutable (scheme))
|
||||||
|
(body
|
||||||
|
(define-syntax require-extension
|
||||||
|
(syntax-rules ()
|
||||||
|
((require-extension (prefix mod ...))
|
||||||
|
(begin (import (prefix mod) ...)))))))
|
Loading…
Add table
Reference in a new issue