summaryrefslogtreecommitdiff
path: root/Sacla/core.lisp
blob: 71b68bd68962c2b0066764c0a5ce14a75d3d4f76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
;; Copyright (C) 2002-2004, Yuji Minejima <ggb01164@nifty.ne.jp>
;; ALL RIGHTS RESERVED.
;;
;; $Id: core.lisp,v 1.30 2004/05/26 07:57:52 yuji Exp $
;; 
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following conditions
;; are met:
;; 
;;  * Redistributions of source code must retain the above copyright
;;    notice, this list of conditions and the following disclaimer.
;;  * Redistributions in binary form must reproduce the above copyright
;;    notice, this list of conditions and the following disclaimer in
;;    the documentation and/or other materials provided with the
;;    distribution.
;; 
;; 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
;; OWNER 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.

;;; objects
;; function
(defun fdefinition (function-name)
  (etypecase function-name
    (symbol (symbol-function function-name))
    (setf-function-name )))

;; (defsetf fdefinition (function-name) (new-function)
;;   ;;FIXME
;;   )


;; data and control flow
(defconstant call-arguments-limit
  50)

(defconstant lambda-parameters-limit
  50)

(defconstant lambda-list-keywords
  '(&allow-other-keys &aux &body &environment &key &optional &rest &whole))

(defmacro defparameter (name initial-value 
			&optional (documentation nil documentation-p))
  `(progn (declaim (special ,name))
    (setf (symbol-value ',name) ,initial-value)
    ,(when documentation-p
	   `(setf (documentation ',name 'variable) ',documentation))
    ',name))

(defmacro defvar (name &optional
		  (initial-value nil initial-value-p)
		  (documentation nil documentation-p))
  `(progn (declaim (special ,name))
    ,(when initial-value-p
	   `(unless (boundp ',name)
	     (setf (symbol-value ',name) ,initial-value)))
    ,(when documentation-p
	   `(setf (documentation ',name 'variable) ',documentation))
    ',name))

(defun eql (x y)
  (or (eq x y)
      (and (numberp x) (numberp y) (= x y) (eq (type-of x) (type-of y)))
      (and (characterp x) (characterp y) (char= x y))))

(defun equalp (x y)
  (cond
   ((eq x y) t)
   ((characterp x) (and (characterp y) (char-equal x y)))
   ((numberp x) (and (numberp y) (= x y)))
   ((consp x) (and (consp y) (equalp (car x) (car y)) (equalp (cdr x) (cdr y))))
   ((arrayp x) (and (arrayp y)
		    (equal (array-dimensions x) (array-dimensions y))
		    (dotimes (i (array-total-size x) t)
		      (unless (equalp (row-major-aref x i) (row-major-aref y i))
			(return nil)))))
   ((hash-table-p x) (and (hash-table-p y)
			  (= (hash-table-count x) (hash-table-count y))
			  (eq (hash-table-test x) (hash-table-test y))
			  (with-hash-table-iterator (get x)
			    (loop
			     (multiple-value-bind (entry-returned key x-value)
				 (get)
			       (unless entry-returned
				 (return t))
			       (multiple-value-bind (y-value present-p)
				   (gethash key y)
				 (unless (and present-p (equalp x-value y-value))
				   (return nil))))))))
   ((typep x 'structure-object) (and (typep x 'structure-object)
				     (eq (class-of x) (class-of y))
				     ))
   (t nil)))