From 11f83cf1e3a179d3442ce5610a69483fececffb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Tue, 23 Apr 2019 21:28:40 +0200 Subject: Replace text-flow function. --- module/util.scm | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'module/util.scm') diff --git a/module/util.scm b/module/util.scm index 8abf6877..01d2eeb1 100644 --- a/module/util.scm +++ b/module/util.scm @@ -153,8 +153,10 @@ ;; Still requires all variables to be defined beforehand. (define-syntax set! (syntax-rules () - ((_ field val) - ((@ (guile) set!) field val)) + ((_ field expr) + (let ((val expr)) + ((@ (guile) set!) field val) + val)) ((_ field val rest ...) (begin ((@ (guile) set!) field val) (set! rest ...))))) @@ -289,3 +291,19 @@ (define-macro (catch-multiple thunk . cases) (catch-recur% (map car cases) thunk cases)) +(define-public (flatten lst) + (fold (lambda (subl done) + (append done ((if (list? subl) flatten list) subl))) + '() lst)) + +;; Retuns two values. The longset head which satisfies @var{pred?}, +;; and the rest of the elements of list. +;; Guarentees to only call @var{pred?} once for each element. +(define-public (take-drop-while pred? list) + (let loop ((done '()) (rem list)) + (cond ((null? rem) (values (reverse done) '())) + ((pred? (car rem)) (loop (cons (car rem) done) (cdr rem))) + (else (values (reverse done) rem))))) + + + -- cgit v1.2.3