git @ Cat's Eye Technologies Treacle / master src / index.scm
master

Tree @master (Download .tar.gz)

index.scm @masterraw · history · blame

;
; Support for term indices (pointers to subterms of terms)
; Chris Pressey, March 2008
;

; Copyright (c)2008 Cat's Eye Technologies.  All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions
; are met:
;
; 1. Redistributions of source code must retain the above copyright
;    notices, this list of conditions and the following disclaimer.
; 2. Redistributions in binary form must reproduce the above copyright
;    notices, this list of conditions, and the following disclaimer in
;    the documentation and/or other materials provided with the
;    distribution.
; 3. Neither the names of the copyright holders nor the names of their
;    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.

;
; A term index is represented by a list of integers.  It uniquely
; identifies a subterm position of a term.
;

;
; Create a basic term index that refers to the entire term.
;
(define mk-base-index
  (lambda ()
    '()))

;
; Return a term index which points to the leftmost subterm of the
; term pointed to by the given term index.
;
(define descend-index
  (lambda (index)
    (cons 0 index)))

;
; Return a term index which points to the closest sibling term to
; the right of term pointed to by the given term index.
;
(define next-index
  (lambda (index)
    (cons (+ (car index) 1) (cdr index))))

;
; Retrieve the subterm of the given term at the given term index.
;
(define term-index-fetch
  (lambda (term index)
    (cond ((null? index)
            term)
          (else
            (term-index-fetch (list-ref term (car index)) (cdr index))))))

;
; Return a new term where the subterm at the given term index is replaced
; by the given replacement subterm.
;
(define term-index-store
  (lambda (term index replacement)
    (cond ((null? index)
            replacement)
          (else
            (let* ((nth-subterm (list-ref term (car index)))
                   (new-index   (cdr index))
                   (new-subterm (term-index-store nth-subterm new-index replacement)))
              (list-replace term (car index) new-subterm))))))

;
; Helper function for term-index-store.
;
(define list-replace
  (lambda (elems pos elem)
    (cond ((eq? pos 0)
            (cons elem (cdr elems)))
          (else
            (cons (car elems) (list-replace (cdr elems) (- pos 1) elem))))))