基于字符串调用函数

pow*_*984 6 lisp string common-lisp

我将命令行参数传递给我的Lisp程序,当它们点击我的main函数时,它们的格式如下:

("1 1 1" "dot" "2 2 2") 
Run Code Online (Sandbox Code Playgroud)

我有一个点函数(它接受两个向量作为参数),并希望直接从参数中调用它,但这是不可能的,因为像(funcall(second args)...)接收"点"而不是点作为函数名称.

我试过这个功能的变种:
(defun remove-quotes (s)
(setf (aref s 0) '""))

在意识到引号不是字符串的一部分之前无济于事.有没有一种简单的方法可以做到这一点,或者我应该检查每个字符串然后调用适当的函数?

Rai*_*wig 8

"1 1 1"是一个由五个字符组成的字符串:1,空格,1,空格和1.双引号不是字符串的一部分.

("1 1 1""dot""2 2 2")是三个字符串的列表.

没有"上面的字符."用于分隔s表达式中的字符串.

如果你有一个点函数,你需要告诉我们它期望什么样的输入数据.它有两个数字列表吗?然后,您必须将字符串"1 1 1"转换为数字列表.

(with-input-from-string (in "1 1 1")
  (loop for data = (read in nil in)
   until (eq data in)
   collect data)))
Run Code Online (Sandbox Code Playgroud)

要从字符串"dot"获取函数DOT,首先找到符号DOT,然后获取其符号函数.

(symbol-function (find-symbol (string-upcase "dot")))
Run Code Online (Sandbox Code Playgroud)

对于find-symbol,如果符号所在的特殊包,则可能还需要指定包.

然后将列表转换为向量是下一个构建块.

因此,您需要将函数的参数转换为向量(可能首先将它们转换为列表,如上所示).然后你需要找到这个功能(见上文).如果你有函数和参数,那么你可以使用FUNCALL或APPLY调用函数(更方便).