-
Notifications
You must be signed in to change notification settings - Fork 0
/
proclaim.lisp
42 lines (40 loc) · 2.2 KB
/
proclaim.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
(in-package #:extrinsicl)
(defgeneric process-type-specifier (client environment type-specifier)
(:method (client type-specifier environment)
(resolve-type client environment type-specifier))
(:documentation "Given a type specifier and environment, return an object to store in a Trucler description.
The default method returns the type specifier after macroexpansion in the environment."))
(defun install-proclaim (client environment)
(labels
((+declaration (identifier)
(check-type identifier symbol)
(setf (clostrum:proclamation client environment identifier) identifier))
(set-inline (name inline)
(setf (clostrum:operator-inline client environment name) inline))
(+inline (name) (set-inline name 'inline))
(+notinline (name) (set-inline name 'notinline))
(+special (symbol)
(clostrum:make-variable client environment symbol))
(typer (type-specifier)
(let ((type (process-type-specifier client environment type-specifier)))
(lambda (symbol)
(setf (clostrum:variable-type client environment symbol) type))))
(ftyper (type-specifier)
(let ((type (process-type-specifier client environment type-specifier)))
(lambda (name)
(setf (clostrum:operator-ftype client environment name) type))))
(#1=#:proclaim (declaration-specifier)
;; for any nonstandard identifiers, you'll need to define your own proclaim.
(ecase declaration-specifier
((declaration) (mapc #'+declaration (rest declaration-specifier)))
((inline) (mapc #'+inline (rest declaration-specifier)))
((notinline) (mapc #'+notinline (rest declaration-specifier)))
((special) (mapc #'+special (rest declaration-specifier)))
((optimize)
(clostrum:proclaim-optimize client environment (rest declaration-specifier)))
((type) (mapc (typer (second declaration-specifier))
(cddr declaration-specifier)))
((ftype) (mapc (ftyper (second declaration-specifier))
(cddr declaration-specifier))))))
(setf (clostrum:fdefinition client environment 'proclaim) #'#1#))
(values))