Handle reference manual automatically.
[clon.git] / package.lisp
blob82f269e1066906a97dc2b40636d914d406ce1ec4
1 ;;; package.lisp --- Common Lisp Package definition
3 ;; Copyright (C) 2010, 2011 Didier Verna
5 ;; Author: Didier Verna <didier@lrde.epita.fr>
6 ;; Maintainer: Didier Verna <didier@lrde.epita.fr>
8 ;; This file is part of Clon.
10 ;; Permission to use, copy, modify, and distribute this software for any
11 ;; purpose with or without fee is hereby granted, provided that the above
12 ;; copyright notice and this permission notice appear in all copies.
14 ;; THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15 ;; WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16 ;; MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17 ;; ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18 ;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19 ;; ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20 ;; OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ;;; Commentary:
25 ;; Contents management by FCM version 0.1.
28 ;;; Code:
30 (in-package :cl-user)
32 (defpackage :com.dvlsoft.clon
33 (:documentation "The Command-Line Options Nuker package.")
34 (:use :cl)
35 (:shadow :*readtable*)
36 (:import-from :com.dvlsoft.clon.asdf
37 :define-constant
38 :+release-major-level+
39 :+release-minor-level+
40 :+release-status+
41 :+release-status-level+
42 :+release-name+
43 :version)
44 (:export
45 ;; From com.dvlsoft.clon.asd:
46 :+release-major-level+
47 :+release-minor-level+
48 :+release-status+
49 :+release-status-level+
50 :+release-name+
51 :version
52 ;; From package.lisp:
53 :nickname-package
54 ;; From src/util.lisp:
55 :exit
56 :cmdline
57 :dump
58 ;; From src/text.lisp:
59 :make-text
60 ;; From src/options/flag.lisp:
61 :make-flag
62 ;; From src/options/switch.lisp:
63 :make-switch
64 ;; From src/options/stropt.lisp:
65 :make-stropt
66 ;; From src/options/lispobj.lisp:
67 :make-lispobj
68 ;; From src/options/path.lisp:
69 :make-path
70 ;; From src/options/enum.lisp:
71 :make-enum
72 ;; From src/options/xswitch.lisp:
73 :make-xswitch
74 ;; From src/group.lisp:
75 :make-group :defgroup
76 ;; From src/synopsis.lisp:
77 :*default-synopsis*
78 :make-synopsis :defsynopsis
79 ;; From src/context.lisp:
80 :*current-context*
81 :make-context
82 :with-context
83 :progname
84 :remainder
85 :cmdline-options-p
86 :cmdline-p
87 :getopt
88 :getopt-cmdline
89 :multiple-value-getopt-cmdline
90 :do-cmdline-options
91 :help))
94 (in-package :com.dvlsoft.clon)
97 ;; -------------------
98 ;; External utilities:
99 ;; -------------------
101 (defun nickname-package (&optional (nickname :clon))
102 "Add NICKNAME (:CLON by default) to the :COM.DVLSOFT.CLON package."
103 (rename-package :com.dvlsoft.clon
104 (package-name :com.dvlsoft.clon)
105 (adjoin nickname (package-nicknames :com.dvlsoft.clon)
106 :test #'string-equal)))
109 ;; -------------------
110 ;; Internal utilities:
111 ;; -------------------
113 (defvar *readtable* (copy-readtable)
114 "The Clon readtable.")
116 (defun tilde-reader (stream char)
117 "Read a series of ~\"strings\" to be concatenated together."
118 (declare (ignore char))
119 (apply #'concatenate 'string
120 (loop :for str := (read stream t nil t)
121 :then (progn (read-char stream t nil t)
122 (read stream t nil t))
123 :collect str
124 :while (eql (peek-char t stream nil nil t) #\~))))
126 (set-macro-character #\~ #'tilde-reader nil *readtable*)
128 ;; ECL and CLISP do not like to see undefined reader macros in expressions
129 ;; that belong to other compilers. For instance this will break:
130 ;; #+ccl (#_ccl-only-function)
131 ;; It seems to be a correct behavior (see *read-suppress* in CLHS), although
132 ;; other implementations like SBCL and CMUCL are more gentle. The solution I
133 ;; use is to define those reader macros to simply return nil.
134 #+(or ecl clisp)
135 (progn
137 (defun dummy-reader (stream subchar args)
138 "Return nil."
139 (declare (ignore stream subchar args))
140 nil)
142 (set-dispatch-macro-character #\# #\_ #'dummy-reader *readtable*)
143 (set-dispatch-macro-character #\# #\$ #'dummy-reader *readtable*))
145 (defmacro in-readtable (name)
146 "Set the current readtable to the value of NAME::*READTABLE*."
147 `(eval-when (:compile-toplevel :load-toplevel :execute)
148 (setf cl:*readtable* (symbol-value (find-symbol "*READTABLE*" ,name)))))
151 ;;; package.lisp ends here