String 基于字符串的调用函数
我将命令行参数传递给我的Lisp程序,当它们碰到我的主函数时,它们的格式如下:String 基于字符串的调用函数,string,lisp,common-lisp,String,Lisp,Common Lisp,我将命令行参数传递给我的Lisp程序,当它们碰到我的主函数时,它们的格式如下: ("1 1 1" "dot" "2 2 2") 我有一个点函数(取两个向量作为参数),希望直接从参数调用它,但这是不可能的,因为类似(funcall(第二个参数)…)的东西接收“点”,而不是点作为函数名 我尝试了此函数的各种变体: (取消删除引号) (setf(aref s 0)) 在意识到引号不是字符串的一部分之前,这是徒劳的。有没有一种简单的方法可以做到这一点,或者我应该检查每个字符串,然后调用相应的
("1 1 1" "dot" "2 2 2")
我有一个点函数(取两个向量作为参数),希望直接从参数调用它,但这是不可能的,因为类似(funcall(第二个参数)…)的东西接收“点”,而不是点作为函数名
我尝试了此函数的各种变体:
(取消删除引号)
(setf(aref s 0))
在意识到引号不是字符串的一部分之前,这是徒劳的。有没有一种简单的方法可以做到这一点,或者我应该检查每个字符串,然后调用相应的函数?“1”是一个由五个字符组成的字符串:1,空格,1,空格和1。双引号不是字符串的一部分 (“1”“点”“2 2”)是由三个字符串组成的列表 上面没有“字符”。用于在s表达式中分隔字符串 如果你有一个点函数,你需要告诉我们它需要什么样的输入数据。 它需要两个数字列表吗?然后必须将字符串“1”转换为数字列表
(with-input-from-string (in "1 1 1")
(loop for data = (read in nil in)
until (eq data in)
collect data)))
要从字符串“DOT”中获取函数点,首先找到符号点,然后获取其符号函数
(symbol-function (find-symbol (string-upcase "dot")))
对于“查找符号”,如果符号所在的包是特殊的,则可能还需要指定包
然后,将列表转换为向量是下一个构建块
因此,您需要将函数的参数转换为向量(可能首先将它们转换为列表,如上面所示)。然后您需要找到函数(见上文)。如果您有then函数和参数,那么您可以使用FUNCALL或APPLY(更方便的方式)调用函数。这个问题有点不清楚,但据我所知,您想要的是,当给出列表
(“1 1 1”“点”“2 2 2”)
作为计算表达式(点“1 1 1”“2 2”)的输入时。
。在这种情况下,您可以执行以下操作:
(defun apply-infix (arg1 f arg2)
(apply (intern (string-upcase f)) (list arg1 arg2)))
(defun apply-list-infix (lst)
(apply 'apply-infix lst))
(apply-list-infix '("1 1 1" "dot" "2 2 2"))
funcall
不接受字符串作为函数指示符。你需要给它一个符号。您可能想做的是:
string upcase
)intern
)。请注意,如果未根据函数名所在的包设置*package*
,则需要将包名作为第二个参数提供给intern
cl user
中名为dot
的函数:
(funcall (intern (string-upcase "dot") 'cl-user) ...)
很抱歉,我的问题不清楚,这与我想要的非常相似-dot将两个向量作为参数,但你让我走上了正确的轨道,谢谢!我不太理解上面的迭代方法,当我尝试运行它时,我得到了一个无限循环。@powerj1984:我已将除非替换为直到。现在应该可以工作了。