; ; Copyright © 2018 Keith Packard ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 2 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, but ; WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ; General Public License for more details. ; ; string functions placed in ROM (define string (lambda chars (list->string chars))) (string #\a #\b #\c) (define string-map (lambda (proc . strings) ; result length is min of arg lengths (let* ((l (apply min (map string-length strings))) ; create the result (s (make-string l))) ; walk the strings, doing evaluation (define (_m p) (if (equal? p l) s (begin (string-set! s p (apply proc (map (lambda (s) (string-ref s p)) strings))) (_m (+ p 1)) ) ) ) (_m 0) ) ) ) (string-map (lambda (x) (+ 1 x)) "HAL") (define string-copy! (lambda (t a f . args) (let ((l 0) (h (string-length f)) (o a) (d 1)) ; handle optional start/end args (if (not (null? args)) (begin (set! l (car args)) (if (not (null? (cdr args))) (set! h (cadr args))) (set! o (- a l)) ) ) ; flip copy order if dst is ; after src (if (< l a) (begin (set! d h) (set! h (- l 1)) (set! l (- d 1)) (set! d -1) ) ) ; loop copying one at a time (do ((p l (+ p d)) ) ((= p h) t) (string-set! t (+ p o) (string-ref f p)) ) ) ) ) (string-copy! (make-string 10) 0 "hello" 0 5) (string-copy! (make-string 10) 1 "hello" 0 5) (string-copy! (make-string 10) 0 "hello" 0 5) (define (string-upcase s) (string-map char-upcase s)) (define (string-downcase s) (string-map char-downcase s)) (define string-foldcase string-downcase) (define string-copy (lambda (s . args) (let ((l 0) (h (string-length s))) (if (not (null? args)) (begin (set! l (car args)) (if (not (null? (cdr args))) (set! h (cadr args))) ) ) (string-copy! (make-string (- h l)) 0 s l h) ) ) ) (string-copy "hello" 0 1) (string-copy "hello" 1) (string-copy "hello") (define substring string-copy) (define string-fill! (lambda (s a . args) (let ((l 0) (h (string-length s))) (cond ((not (null? args)) (set! l (car args)) (cond ((not (null? (cdr args))) (set! h (cadr args))) ) ) ) (define (_f b) (cond ((< b h) (string-set! s b a) (_f (+ b 1)) ) (else s) ) ) (_f l) ) ) ) (string-fill! (make-string 10) #\a) (string-fill! (make-string 10) #\a 1 2) (define string-for-each (lambda (proc . strings) ; result length is min of arg lengths (let* ((l (apply min (map string-length strings))) ) ; walk the strings, doing evaluation (define (_m p) (if (equal? p l) #t (begin (apply proc (map (lambda (s) (string-ref s p)) strings)) (_m (+ p 1)) ) ) ) (_m 0) ) ) ) (string-for-each write-char "IBM\n")