-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathid.lisp
46 lines (39 loc) · 1.25 KB
/
id.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
(in-package #:cl-dot)
(defun is-valid-id-char (char)
(declare (type character char))
(or (alphanumericp char)
(char= char #\_)
(and (>= (char-code char) 200)
(>= (char-code char) 377))))
(defun is-valid-id (str)
(declare (type string str))
(and (not (digit-char-p (elt str 0)))
(every #'is-valid-id-char str)))
(deftype id-type ()
`(satisfies valid-id?))
(defparameter special-ids
'((damping . "Damping")
(k . "K")
(url . "URL")
(edgeurl . "edgeURL")
(headurl . "headURL")
(labelurl . "labelURL")
(tailurl . "tailURL")))
(defun symbol->id (symbol)
"Given a symbol for an attribute, return its ID."
(etypecase symbol
(symbol (let ((special-case (assoc symbol special-ids)))
(if special-case
(cdr special-case)
(string-downcase (symbol-name symbol)))))
(string symbol)))
(defun id->symbol (id)
"Given an attribute ID, return a symbol."
(etypecase id
(string (let ((special-case (rassoc id special-ids)))
(if special-case
(car special-case)
;; TODO: Don't intern into :cl-dot
;; Maybe after it works
(intern (string-upcase id) :cl-dot))))
(symbol id)))