Changeset 4200
- Timestamp:
- 10/05/03 15:36:54 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/j/src/org/armedbear/lisp/defstruct.lisp
r4156 r4200 2 2 ;;; 3 3 ;;; Copyright (C) 2003 Peter Graves 4 ;;; $Id: defstruct.lisp,v 1.2 4 2003-10-01 13:59:52piso Exp $4 ;;; $Id: defstruct.lisp,v 1.25 2003-10-05 15:36:54 piso Exp $ 5 5 ;;; 6 6 ;;; This program is free software; you can redistribute it and/or … … 22 22 (defvar *ds-name*) 23 23 (defvar *ds-conc-name*) 24 (defvar *ds-constructor *)24 (defvar *ds-constructors*) 25 25 (defvar *ds-copier*) 26 26 (defvar *ds-named*) … … 28 28 (defvar *ds-print-function*) 29 29 30 (defun define-constructor (slots) 31 (when *ds-constructor* 32 (let* ((constructor (intern *ds-constructor*)) 33 (slot-names (mapcar #'(lambda (x) (if (atom x) x (car x))) slots)) 34 (inits (mapcar #'(lambda (x) (if (atom x) nil (cadr x))) slots)) 35 (slot-descriptions (mapcar #'(lambda (x y) (list x y)) slot-names inits)) 36 (keys (cons '&key slot-descriptions))) 37 `((defun ,constructor ,keys 38 (%make-structure ',*ds-name* (list ,@slot-names))))))) 30 (defun define-constructor (constructor slots) 31 (let* ((constructor-name (intern (car constructor))) 32 (slot-names (mapcar #'(lambda (x) (if (atom x) x (car x))) slots)) 33 (inits (mapcar #'(lambda (x) (if (atom x) nil (cadr x))) slots)) 34 (slot-descriptions (mapcar #'(lambda (x y) (list x y)) slot-names inits)) 35 (keys (cons '&key slot-descriptions))) 36 `((defun ,constructor-name ,keys 37 (%make-structure ',*ds-name* (list ,@slot-names)))))) 38 39 (defun default-constructor-name () 40 (concatenate 'string "MAKE-" (symbol-name *ds-name*))) 41 42 (defun define-constructors (slots) 43 (if *ds-constructors* 44 (let ((results ())) 45 (dolist (constructor *ds-constructors*) 46 (when (car constructor) 47 (setf results (append results (define-constructor constructor slots))))) 48 results) 49 (define-constructor (cons (default-constructor-name) nil) slots))) 39 50 40 51 (defun define-predicate () … … 74 85 (dolist (slot slots) 75 86 (let ((slot-name (if (atom slot) slot (car slot)))) 76 (set qresult (append result (define-access-function slot-name index))))87 (setf result (append result (define-access-function slot-name index)))) 77 88 (incf index)) 78 89 result)) … … 89 100 (make-symbol (string (cadr option)))))) 90 101 (:constructor 91 (when (= (length option) 2) 92 (if (null (cadr option)) 93 (setf *ds-constructor* nil) 94 (setf *ds-constructor* (symbol-name (cadr option)))))) 102 (let* ((args (cdr option)) 103 (numargs (length args)) 104 name arglist) 105 (case numargs 106 (0 ; Use default name. 107 (setf name (default-constructor-name)) 108 (setf arglist nil) 109 (push (list name arglist) *ds-constructors*)) 110 (1 111 (if (null (car args)) 112 (setf name nil) ; No constructor. 113 (setf name (symbol-name (car args)))) 114 (setf arglist nil) 115 (push (list name arglist) *ds-constructors*)) 116 (2)))) 95 117 (:predicate 96 118 (when (= (length option) 2) … … 102 124 (setf *ds-name* (car name-and-options)) 103 125 (setf *ds-conc-name* (make-symbol (concatenate 'string (symbol-name *ds-name*) "-"))) 104 (setf *ds-constructor* (concatenate 'string "MAKE-" (symbol-name *ds-name*)))105 126 (setf *ds-predicate* (concatenate 'string (symbol-name *ds-name*) "-P")) 106 127 (let ((options (cdr name-and-options))) … … 119 140 (let ((*ds-name* nil) 120 141 (*ds-conc-name* nil) 121 (*ds-constructor * nil)142 (*ds-constructors* nil) 122 143 (*ds-copier* nil) 123 144 (*ds-predicate* nil) … … 130 151 `(progn 131 152 (make-structure-class ',*ds-name*) 132 ,@(define-constructor slots)153 ,@(define-constructors slots) 133 154 ,@(define-predicate) 134 155 ,@(define-access-functions slots)
Note: See TracChangeset
for help on using the changeset viewer.