/
defs.lisp
127 lines (117 loc) · 5.67 KB
/
defs.lisp
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
;;; -*- Mode: Lisp; Package: CL-User; Syntax: ANSI-Common-Lisp -*-
(in-package :cl-user)
;;; File: defs.lisp
;;; Contents: Package, system, and other build-related definitions for FSet.
;;;
;;; This file is part of FSet. Copyright (c) 2007-2012 Scott L. Burson.
;;; FSet is licensed under the Lisp Lesser GNU Public License, or LLGPL.
;;; See: http://opensource.franz.com/preamble.html
;;; This license provides NO WARRANTY.
(defpackage :fset
(:use :cl :gmap :new-let :lexical-contexts)
(:shadowing-import-from :new-let #:let #:cond)
(:shadowing-import-from :mt19937 #:make-random-state #:random #:*random-state*)
;; For each of these shadowed symbols, using packages must either shadowing-
;; import it or shadowing-import the original Lisp symbol.
(:shadow ;; Shadowed type/constructor names
#:set #:map
;; Shadowed set operations
#:union #:intersection #:set-difference #:complement
;; Shadowed sequence operations
#:first #:last #:subseq #:reverse #:sort #:stable-sort #:sort-and-group
#:reduce
#:find #:find-if #:find-if-not
#:count #:count-if #:count-if-not
#:position #:position-if #:position-if-not
#:remove #:remove-if #:remove-if-not
#:substitute #:substitute-if #:substitute-if-not
#:some #:every #:notany #:notevery)
(:export #:collection #:set #:bag #:map #:seq #:tuple
#:collection? #:set? #:bag? #:map? #:seq? #:tuple?
#:wb-set #:wb-bag #:wb-map #:wb-seq #:dyn-tuple
;; `Equal?' is exported because users may want to call it; `Compare'
;; because they may want to extend it; and `Compare-Slots' because it's
;; useful in extending `Compare'. But `Less-Than?' and `Greater-Than?'
;; are unlikely to be useful in user code.
#:equal? #:compare #:compare-slots #:identity-ordering-mixin
#:define-cross-type-compare-methods
#:compare-lexicographically
#:empty? #:nonempty? #:size #:set-size #:arb
#:contains? #:domain-contains? #:range-contains? #:member? #:multiplicity
#:empty-set #:empty-bag #:empty-map #:empty-seq #:empty-tuple
#:empty-wb-set #:empty-wb-bag #:empty-wb-map #:empty-wb-seq
#:empty-dyn-tuple
#:least #:greatest #:lookup #:rank #:at-rank #:@
#:with #:less #:split-from #:split-above #:split-through #:split-below
#:union #:bag-sum #:intersection #:bag-product #:complement
#:set-difference #:set-difference-2 #:bag-difference
#:subset? #:disjoint? #:subbag?
#:filter #:filter-pairs #:partition
#:image #:reduce #:domain #:range #:with-default
#:map-union #:map-intersection #:map-difference-2
#:restrict #:restrict-not #:compose #:map-default
#:first #:last
#:lastcons #:head #:tail
#:with-first #:less-first #:push-first #:pop-first
#:with-last #:less-last #:push-last #:pop-last #:appendf #:prependf
#:insert #:splice #:subseq #:concat #:reverse #:sort #:stable-sort
#:find #:find-if #:find-if-not
#:count #:count-if #:count-if-not
#:position #:position-if #:position-if-not
#:remove #:remove-if #:remove-if-not
#:substitute #:substitute-if #:substitute-if-not
#:convert #:iterator
#:do-set #:do-bag #:do-bag-pairs #:do-map #:do-map-domain #:do-seq #:do-tuple
#:adjoinf #:removef #:includef #:excludef
#:unionf #:intersectf #:imagef #:composef
#:define-tuple-key #:def-tuple-key #:get-tuple-key #:tuple-key-name #:tuple-key?
#:tuple-merge
#:fset-setup-readtable #:*fset-readtable*
#:$ #:%
;; Used by the bag methods that convert to and from lists.
#:alist
;; Bounded sets
#:bounded-set #:make-bounded-set #:bounded-set-contents
;; Relations
#:relation #:2-relation #:wb-2-relation #:empty-2-relation #:empty-wb-2-relation
#:do-2-relation
#:lookup-inv #:inverse #:join #:conflicts #:map-to-sets
#:list-relation #:wb-list-relation #:empty-list-relation
#:empty-wb-list-relation #:arity #:query #:query-multi #:do-list-relation
#:query-registry #:empty-query-registry #:with-query #:less-query
#:all-queries #:lookup-multi #:forward-key #:lookup-restricted
#:lookup-multi-restricted
;; named-readtable readtable
#:fset-readtable))
;;; A convenient package for experimenting with FSet. Also serves as an example
;;; of how one might create a package for code to be written using FSet. Note,
;;; though, that for each of the shadowing-imported symbols, it's up to you whether
;;; to import the FSet version or the CL version. It's also up to you, of course,
;;; whether you want to use GMap and New-Let.
;;; You may also wish to do:
;;; (setq *readtable* *fset-readtable*)
(defpackage :fset-user
(:use :cl :fset :gmap :new-let :lexical-contexts)
(:shadowing-import-from :new-let #:let #:cond)
(:shadowing-import-from :fset
;; Shadowed type/constructor names
#:set #:map
;; Shadowed set operations
#:union #:intersection #:set-difference #:complement
;; Shadowed sequence operations
#:first #:last #:subseq #:reverse #:sort #:stable-sort
#:reduce
#:find #:find-if #:find-if-not
#:count #:count-if #:count-if-not
#:position #:position-if #:position-if-not
#:remove #:remove-if #:remove-if-not
#:substitute #:substitute-if #:substitute-if-not
#:some #:every #:notany #:notevery))
;;; The seq implementation tries to use strings for leaf vectors when possible.
;;; In some Lisp implementations, there are two kinds of strings; but in some
;;; of these, the larger form takes as much space as a general vector, so nothing
;;; is to be saved by using it.
(when (and (not (typep (make-string 1 :element-type 'extended-char) 'base-string))
(not (and (> (integer-length (1- char-code-limit)) 16)
(< (integer-length most-positive-fixnum) 32))))
(pushnew ':FSet-Ext-Strings *features*))