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) '""))
在意识到引号不是字符串的一部分之前无济于事.有没有一种简单的方法可以做到这一点,或者我应该检查每个字符串然后调用适当的函数?
"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调用函数(更方便).