mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 21:59:17 +02:00
They can be close()d explicitly with close-file-descriptor, and will close() on gc, but only explicitly closing the last port on them will close the fileno. Notably needed for network sockets where we open separate input and output ports on the same socket.
53 lines
1.7 KiB
Scheme
53 lines
1.7 KiB
Scheme
;; misc.scm -- miscellaneous list utilities
|
|
;; Copyright (c) 2009-2012 Alex Shinn. All rights reserved.
|
|
;; BSD-style license: http://synthcode.com/license.txt
|
|
|
|
(define (map-onto proc ls init)
|
|
(let lp ((ls (reverse ls)) (res init))
|
|
(if (null? ls) res (lp (cdr ls) (cons (proc (car ls)) res)))))
|
|
|
|
(define (append! . lists) (concatenate! lists))
|
|
|
|
(define (concatenate lists)
|
|
(let lp ((ls (reverse lists)) (res '()))
|
|
(if (null? ls) res (lp (cdr ls) (append (car ls) res)))))
|
|
|
|
(define (concatenate! lists)
|
|
(if (null? lists)
|
|
'()
|
|
(let lp ((ls lists))
|
|
(cond ((not (pair? (cdr ls)))
|
|
(car lists))
|
|
(else
|
|
(set-cdr! (last-pair (car ls)) (cadr ls))
|
|
(lp (cdr ls)))))))
|
|
|
|
(define (append-reverse rev tail)
|
|
(if (null? rev) tail (append-reverse (cdr rev) (cons (car rev) tail))))
|
|
|
|
(define (append-reverse! rev tail)
|
|
(if (null? rev)
|
|
tail
|
|
(let ((head (reverse! rev)))
|
|
(set-cdr! rev tail)
|
|
head)))
|
|
|
|
(define (zip . lists) (apply map list lists))
|
|
|
|
(define (unzip1 ls) (map first ls))
|
|
(define (unzip2 ls) (values (map first ls) (map second ls)))
|
|
(define (unzip3 ls) (values (map first ls) (map second ls) (map third ls)))
|
|
(define (unzip4 ls)
|
|
(values (map first ls) (map second ls) (map third ls) (map fourth ls)))
|
|
(define (unzip5 ls)
|
|
(values (map first ls) (map second ls) (map third ls) (map fourth ls)
|
|
(map fifth ls)))
|
|
|
|
(define (count pred ls . lists)
|
|
(if (null? lists)
|
|
(let lp ((ls ls) (res 0))
|
|
(if (pair? ls) (lp (cdr ls) (if (pred (car ls)) (+ res 1) res)) res))
|
|
(let lp ((lists (cons ls lists)) (res 0))
|
|
(if (every pair? lists)
|
|
(lp (map cdr lists) (if (apply pred (map car lists)) (+ res 1) res))
|
|
res))))
|