diff --git a/scheme/base.sld b/scheme/base.sld index 6705dbc1..cf2cdb11 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -6,7 +6,6 @@ ; TODO: need filter for the next two. also, they really belong in SRFI-1, not here ;delete ;delete-duplicates - list-insert-at! call-with-current-continuation call/cc call-with-values diff --git a/scheme/common.scm b/scheme/common.scm index 0191618f..a469dde4 100644 --- a/scheme/common.scm +++ b/scheme/common.scm @@ -33,30 +33,3 @@ ;; Features implemented by this Scheme (define *features* '(cyclone)) -;; Based off corresponding SRFI-1 definition -(define (delete x lis) - (filter (lambda (y) (not (equal? x y))) lis)) - -;; Inefficient version based off code from SRFI-1 -(define (delete-duplicates lis) - (define (recur lis) ; ((lis lis)) - (if (null? lis) lis - (let* ((x (car lis)) - (tail (cdr lis)) - (new-tail (recur (delete x tail)))) - (if (eq? tail new-tail) lis (cons x new-tail))))) - (recur lis)) - -;; Insert obj at index k of list, increasing length of list by one. -(define (list-insert-at! lis obj k) - (cond - ((null? lis) (error "list-insert-at!, lis cannot be null")) - ((and (> k 0) (null? (cdr lis))) - (set-cdr! lis (cons obj '()))) - ((zero? k) - (let ((old-car (car lis))) - (set-car! lis obj) - (set-cdr! lis (cons old-car (cdr lis))))) - (else - (list-insert-at! (cdr lis) obj (- k 1))))) - diff --git a/scheme/cyclone/util.sld b/scheme/cyclone/util.sld index 21c5d76b..9c17fb74 100644 --- a/scheme/cyclone/util.sld +++ b/scheme/cyclone/util.sld @@ -12,6 +12,9 @@ mangle mangle-global ;; Scheme library functions + delete + delete-duplicates + list-insert-at! any every filter) diff --git a/util.scm b/util.scm index 587b6b83..d5c5822a 100644 --- a/util.scm +++ b/util.scm @@ -48,6 +48,33 @@ (recur tail))))))) (recur lis))) +;; Based off corresponding SRFI-1 definition +(define (delete x lis) + (filter (lambda (y) (not (equal? x y))) lis)) + +;; Inefficient version based off code from SRFI-1 +(define (delete-duplicates lis) + (define (recur lis) ; ((lis lis)) + (if (null? lis) lis + (let* ((x (car lis)) + (tail (cdr lis)) + (new-tail (recur (delete x tail)))) + (if (eq? tail new-tail) lis (cons x new-tail))))) + (recur lis)) + +;; Insert obj at index k of list, increasing length of list by one. +(define (list-insert-at! lis obj k) + (cond + ((null? lis) (error "list-insert-at!, lis cannot be null")) + ((and (> k 0) (null? (cdr lis))) + (set-cdr! lis (cons obj '()))) + ((zero? k) + (let ((old-car (car lis))) + (set-car! lis obj) + (set-cdr! lis (cons old-car (cdr lis))))) + (else + (list-insert-at! (cdr lis) obj (- k 1))))) + ;; Name-mangling.