String 基于字符串的调用函数

String 基于字符串的调用函数,string,lisp,common-lisp,String,Lisp,Common Lisp,我将命令行参数传递给我的Lisp程序,当它们碰到我的主函数时,它们的格式如下: ("1 1 1" "dot" "2 2 2") 我有一个点函数(取两个向量作为参数),希望直接从参数调用它,但这是不可能的,因为类似(funcall(第二个参数)…)的东西接收“点”,而不是点作为函数名 我尝试了此函数的各种变体: (取消删除引号) (setf(aref s 0)) 在意识到引号不是字符串的一部分之前,这是徒劳的。有没有一种简单的方法可以做到这一点,或者我应该检查每个字符串,然后调用相应的

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

("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
不接受字符串作为函数指示符。你需要给它一个符号。您可能想做的是:

  • 将字符串转换为大写(Lisp符号通常是大写的,尽管看起来Lisp不区分大小写,但这只是因为读取器将其默认读取的所有符号都大写)(
    string upcase
  • 创建或查找具有给定名称的符号(
    intern
    )。请注意,如果未根据函数名所在的包设置
    *package*
    ,则需要将包名作为第二个参数提供给
    intern
  • 例如(对于包
    cl user
    中名为
    dot
    的函数:

    (funcall (intern (string-upcase "dot") 'cl-user) ...)
    

    很抱歉,我的问题不清楚,这与我想要的非常相似-dot将两个向量作为参数,但你让我走上了正确的轨道,谢谢!我不太理解上面的迭代方法,当我尝试运行它时,我得到了一个无限循环。@powerj1984:我已将除非替换为直到。现在应该可以工作了。