Fre*_*d_2 2 lisp parameters binding common-lisp
我必须定义一个LISP函数,为参数分配另一个函数的结果,如下所示:
(defun assign-param (x)
(defparameter param (generic-funct x)))
Run Code Online (Sandbox Code Playgroud)
assign-param的结果是PARAM在第一次调用时.如果我再做一次调用,函数assign-param会再次返回PARAM,但这样:
Warning: (DEFVAR PARAM) defined more than once in
C:\Users\****\Desktop\****\****.lisp.
PARAM
Run Code Online (Sandbox Code Playgroud)
我尝试使用defvar而不是defparameter使用相同的结果.
有没有办法避免这个警告信息?
有没有办法自动生成其他参数(如果已存在)?(例如:如果param已经在内存中,则分配给param1,param2 ...)
没有理由在函数内部使用它们.
你可能想做的事情是这样的
(defvar *param*)
(defun assign-param (x)
(setq *param* (generic-funct x))
'*param*) ; so that `assign-param` returns the symbol instead of the new value, like `defvar`
Run Code Online (Sandbox Code Playgroud)
然而,你对最后一个问题param1,param2&C意义不大(是的,这是可以做到的,而且,不,你不会想这样做).
您似乎希望拥有一组全局参数,例如,环境或配置文件动态设置.
有两种主要方法:哈希表和包.
简单直接; 将任何值与任何字符串相关联:
(defvar *parameters* (make-hash-table :test 'equal))
(defun param-value (param-name)
(gethash param-name *parameters*))
(defun (setf param-value) (new-value param-name)
(setf (gethash param-name *parameters*) new-value))
(param-value "foo")
==> NIL; NIL
(setf (param-value "foo") "bar")
==> "bar"
(param-value "foo")
==> "bar"; T
(defun delete-param (param-name)
(remhash param-name *parameters*))
Run Code Online (Sandbox Code Playgroud)
请注意,您应该修改param-value发出错误信号,如果第二值gethash是nil,即参数不存在.
更多参与,但您可以将更多"东西"与您的参数对象相关联:
(defvar *parameters* (make-package "parameters" :use ()))
(defun param-value (param-name)
(multiple-value-bind (param status) (find-symbol param-name *parameters*)
(unless status
(error "Parameter %s does not exist" param-name))
(symbol-value param)))
(defun (setf param-value) (new-value param-name)
(setf (symbol-value (intern param-name *parameters*)) new-value))
(defun delete-param (param-name)
(multiple-value-bind (param status) (find-symbol param-name *parameters*)
(when status
(unintern param))))
Run Code Online (Sandbox Code Playgroud)
这种方法的主要优点是read与软件包的集成,这将使配置文件解析更容易.
一个小优点是您不仅可以存储值,还可以在参数中存储函数和属性列表.