`std::variant` 只不过是类似于 rust 中的 `enum` lisp 的表现力不比 cpp 丰富 ? lisp 里头可以自定义 `start...end` 甚至可以实现 rust 中的 `?` ``` ;; 1. 定义读取函数 (defun |#[-reader| (stream char arg) (declare (ignore char arg)) ;; 读取 [] 内部的内容作为符号 (let* ((content (read-delimited-list #\] stream t)) (sym (car content))) ;; 获取符号,例如 2..10 (if (symbolp sym) (let* ((str (symbol-name sym)) (pos (search ".." str))) (if pos (let ((start (parse-integer (subseq str 0 pos))) (end (parse-integer (subseq str (+ pos 2))))) ;; 返回生成列表的代码 `(loop for i from ,start to ,end collect i)) (error "Syntax should be like #[2..10]"))) (error "Content inside #[] must be a symbol")))) ;; 2. 将 #[ 注册到读取表 (set-dispatch-macro-character #\# #\[ #'|#[-reader|) (set-macro-character #\] (get-macro-character #\))) ;; 让 ] 像 ) 一样作为结束符 (print #[2..10]) ;; 输出: (2 3 4 5 6 7 8 9 10) ```