我想使用defmethod或defun使用其中一个参数动态启动哈希表来创建名称.例如:
(defun foo (arg)
(let ((NAME (read-from-string (format nil "\*~S\*" arg))))
(defparameter NAME (make-hash-table))))
Run Code Online (Sandbox Code Playgroud)
当然,foo使用符号创建哈希表NAME,而不是NAMEin 的值let.我该怎么做才能获得NAME创建这个哈希表的价值?
在函数中创建全局变量几乎总是错误的.
使用read-from-string而不是使用创建新符号几乎总是错误的intern.
你可能想要的是什么
(defmacro def-ht (name)
(let ((var (intern (concatenate 'string "*" (symbol-name name) "*")
(symbol-package name))))
`(defparameter ,var (make-hash-table))))
(def-ht foo)
Run Code Online (Sandbox Code Playgroud)
你也许可以做到这一点的功能太-通过检查宏扩展一的defparameter形式,并把所需要的东西的功能:
(defun make-ht-var (name)
(let ((var (intern (concatenate 'string "*" (symbol-name name) "*")
(symbol-package name))))
(setf (symbol-value var) (make-hash-table))
(proclaim (list var 'special))))
(make-ht-var 'foo)
Run Code Online (Sandbox Code Playgroud)
请注意,函数的参数是引用的,但宏的参数不是.
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |