~ chicken-core (chicken-5) 8b8add5b95eb1debbf354461fe05faa35123cab5
commit 8b8add5b95eb1debbf354461fe05faa35123cab5 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sat Jan 24 12:50:22 2015 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sat Jan 24 12:50:22 2015 +0100 Added minimal implementation of some srfi-1 procedures. diff --git a/mini-srfi-1.scm b/mini-srfi-1.scm new file mode 100644 index 00000000..9c21041b --- /dev/null +++ b/mini-srfi-1.scm @@ -0,0 +1,65 @@ +;;;; minimal implementation of SRFI-1 primitives +; +; +; Copyright (c) 2015, The CHICKEN Team +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following +; conditions are met: +; +; Redistributions of source code must retain the above copyright notice, this list of conditions and the following +; disclaimer. +; Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following +; disclaimer in the documentation and/or other materials provided with the distribution. +; Neither the name of the author nor the names of its contributors may be used to endorse or promote +; products derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS +; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR +; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +; POSSIBILITY OF SUCH DAMAGE. + + +(declare + (hide take split-at! append-map every any)) + + +(define (take lst n) + (if (fx<= n 0) + lst + (cons (car lst) (take lst (fx- n 1))))) + +(define (split-at! lst n) + (let loop ((n n) (prev #f) (node lst)) + (if (fx<= n 0) + (cond (prev + (set-cdr! prev '()) + (values lst node)) + (else values '() lst)) + (loop (fx- n 1) node (cdr node))))) + +(define (append-map proc lst1 . lsts) + (if (null? lsts) + (foldr (lambda (x r) (append (proc x) r)) '() lst1) + (let loop ((lsts (cons lst1 lsts))) + (if (any null? lsts) + '() + (append (apply proc (map (lambda (x) (car x)) lsts)) + (loop (map (lambda (x) (cdr x)) lsts))))))) + +(define (every pred lst) + (let loop ((lst lst)) + (cond ((null? lst)) + ((not (pred (car lst))) #f) + (else (loop (cdr lst)))))) + +(define (any pred lst) + (let loop ((lst lst)) + (cond ((null? lst) #f) + ((pred (car lst))) + (else (loop (cdr lst))))))Trap