使用defparameter定义变量,其名称在运行时确定

yan*_*ics 1 lisp common-lisp

我想使用defmethoddefun使用其中一个参数动态启动哈希表来创建名称.例如:

(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创建这个哈希表的价值?

sds*_*sds 7

一般说明

  • 在函数中创建全局变量几乎总是错误的.

  • 使用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)

请注意,函数的参数引用的,但宏的参数不是.