[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Implementing 2d-put! and 2d-get in DrScheme
> Try (load "prop2d.scm") at the top of your definitions window. -- Matthias
I tried this, however the file uses some procedures that apparently aren't
defined in DrScheme?
In particular, it errors saying "reference to undefined identifier: declare"
Here's the contents of the prop2d.scm file, with the procedures 2D-put! and
2D-get that I'm interested in:
Any suggestions?
Thanks again for your help,
-John
--
// John J Reilly
// Work: reil0090@umn.edu
// Play: john@fingerlust.net
// Web : http://www.fingerlust.net
----------------------------------------------------------------------------
#| -*-Scheme-*-
$Id: prop2d.scm,v 14.3 1999/01/02 06:11:34 cph Exp $
Copyright (c) 1988, 1999 Massachusetts Institute of Technology
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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|#
;;;; Two Dimensional Property Tables
;;; package: (runtime 2D-property)
(declare (usual-integrations))
(define (initialize-package!)
(set! system-properties '())
(set! delete-invalid-hash-numbers! (list-deletor! filter-bucket!))
(set! delete-invalid-y! (list-deletor! filter-entry!))
(add-secondary-gc-daemon! gc-system-properties!))
(define system-properties)
(define (2D-put! x y value)
(let ((x-hash (object-hash x))
(y-hash (object-hash y)))
(let ((bucket (assq x-hash system-properties)))
(if bucket
(let ((entry (assq y-hash (cdr bucket))))
(if entry
(set-cdr! entry value)
(set-cdr! bucket
(cons (cons y-hash value)
(cdr bucket)))))
(set! system-properties
(cons (cons x-hash
(cons (cons y-hash value)
'()))
system-properties))))))
(define (2D-get x y)
(let ((bucket (assq (object-hash x) system-properties)))
(and bucket
(let ((entry (assq (object-hash y) (cdr bucket))))
(and entry
(cdr entry))))))
;;; Returns TRUE iff an entry was removed.
;;; Removes the bucket if the entry removed was the only entry.
(define (2D-remove! x y)
(let ((bucket (assq (object-hash x) system-properties)))
(and bucket
(begin (set-cdr! bucket
(del-assq! (object-hash y)
(cdr bucket)))
(if (null? (cdr bucket))
(set! system-properties
(del-assq! (object-hash x)
system-properties)))
true))))
;;; This clever piece of code removes all invalid entries and buckets,
;;; and also removes any buckets which [subsequently] have no entries.
(define (gc-system-properties!)
(set! system-properties (delete-invalid-hash-numbers! system-properties)))
(define (filter-bucket! bucket)
(or (not (valid-hash-number? (car bucket)))
(begin (set-cdr! bucket (delete-invalid-y! (cdr bucket)))
(null? (cdr bucket)))))
(define (filter-entry! entry)
(not (valid-hash-number? (car entry))))
(define delete-invalid-hash-numbers!)
(define delete-invalid-y!)
(define (2D-get-alist-x x)
(let ((bucket (assq (object-hash x) system-properties)))
(if bucket
(let loop ((rest (cdr bucket)))
(cond ((null? rest) '())
((valid-hash-number? (caar rest))
(cons (cons (object-unhash (caar rest))
(cdar rest))
(loop (cdr rest))))
(else (loop (cdr rest)))))
'())))
(define (2D-get-alist-y y)
(let ((y-hash (object-hash y)))
(let loop ((rest system-properties))
(cond ((null? rest) '())
((valid-hash-number? (caar rest))
(let ((entry (assq y-hash (cdar rest))))
(if entry
(cons (cons (object-unhash (caar rest))
(cdr entry))
(loop (cdr rest)))
(loop (cdr rest)))))
(else (loop (cdr rest)))))))