有没有一种方法可以不在Common Lisp中传递参数而不是传递;零;?

有没有一种方法可以不在Common Lisp中传递参数而不是传递;零;?,lisp,common-lisp,Lisp,Common Lisp,我是根据用户输入调用函数的,但有些函数有两个参数,有些函数只有一个参数。在每个函数上使用&optional参数(并且从不使用它),有没有一种方法可以在参数的值为“NIL”时不传递参数 这是一个交互式虚构游戏,用户在其中键入一些命令,并将这些命令转换为函数调用 (defun inputs (state) (format *query-io* "> ") (force-output *query-io*) (let* ((entry (cl-ppcre:split "\

我是根据用户输入调用函数的,但有些函数有两个参数,有些函数只有一个参数。在每个函数上使用&optional参数(并且从不使用它),有没有一种方法可以在参数的值为“NIL”时不传递参数

这是一个交互式虚构游戏,用户在其中键入一些命令,并将这些命令转换为函数调用

(defun inputs (state)
    (format *query-io* "> ")
    (force-output *query-io*)
    (let* ((entry (cl-ppcre:split "\\s+" (string-downcase (read-line *query-io*))))
      (function (car entry))
      (args (cdr entry)))
      (if (valid-call function)
      (funcall (symbol-function (read-from-string function))
           state
           args)
      (progn
        (format *query-io* "Sorry, I don't know the command '~a'~%~%" function)
        (inputs state)))))
如果用户输入是“装备剑”,我需要调用函数“装备”,将“(“剑”)作为参数传递,但如果用户输入是“状态”,我需要调用函数“状态”,而不传递“参数”,而不是将它们作为“NIL”传递。

我想您需要使用 而不是 而不是 (这对我来说非常重要!) 及 而不是:

使用
apply
可以让命令接受任意数量的参数,而不是一个参数

实际上,您的
有效调用
可能会返回要调用的函数:

(let ((f (valid-call function)))
  (if f
      (apply f state args)
      ...)
我想你想用 而不是 而不是 (这对我来说非常重要!) 及 而不是:

使用
apply
可以让命令接受任意数量的参数,而不是一个参数

实际上,您的
有效调用
可能会返回要调用的函数:

(let ((f (valid-call function)))
  (if f
      (apply f state args)
      ...)

您还可以使用简单的
循环
,而不是递归调用:

(defun inputs (state)
  (loop
   (format *query-io* "> ")
   (force-output *query-io*)
   (let* ((entry (cl-ppcre:split "\\s+" (string-downcase (read-line *query-io*))))
          (function (car entry))
          (args     (cdr entry)))
     (when (valid-call function)
       (apply (symbol-function (find-symbol function))
              state
              args)
       (return))
     (format *query-io* "Sorry, I don't know the command '~a'~%~%" function))))

您还可以使用简单的
循环
,而不是递归调用:

(defun inputs (state)
  (loop
   (format *query-io* "> ")
   (force-output *query-io*)
   (let* ((entry (cl-ppcre:split "\\s+" (string-downcase (read-line *query-io*))))
          (function (car entry))
          (args     (cdr entry)))
     (when (valid-call function)
       (apply (symbol-function (find-symbol function))
              state
              args)
       (return))
     (format *query-io* "Sorry, I don't know the command '~a'~%~%" function))))

“查找符号”应用程序运行不正常。我将代码分为两个包:#:game和#:commands,并创建了一个game.asd文件,在其中定义了游戏系统。如果我尝试使用find符号(而不是从字符串读取)应用函数,则会出现一个错误,通知函数命令::| function |未定义,即使函数是在#:COMMANDS包中定义和导出的。请尝试
(find symbol(string upcase command)
或正确大小写的intern命令。请记住,CL区分大小写,而默认读取器是大小写转换。实际上,
find symbol
返回了
命令:| function |:EXTERNAL
,尝试应用此函数时会出现错误。我最近在学习软件包和系统,也许问题出在定义上。以下是三个定义的代码:您应该确保您的软件包(游戏和命令)不使用其他标准软件包,也不从中继承。我从昨天开始尝试,但仍然没有找到解决方案。我的game.asd文件上的代码是:
(asdf:defsystem“game”:依赖于(#:cl ppcre):组件(:file“game”)(:file“commands”))
commands.lisp文件的开头是:
(defpackage:commands(:use:cl)(:export“end”“sheet”“status”“save”“restore”“reload”“location”“inventory”“)
而game.lisp文件的开头是:
(defpackage:game(:use:cl:cl-ppcre))
我是否需要使用软件包中的
功能?commands.lisp从game.lisp调用了一些函数,而游戏调用了commands“查找符号”应用程序运行不正常。我将代码分为两个包:#:game和#:commands,并创建了一个game.asd文件,在其中定义了游戏系统。如果我尝试使用find符号(而不是从字符串读取)应用函数,则会出现一个错误,通知函数命令::| function |未定义,即使函数是在#:COMMANDS包中定义和导出的。请尝试
(find symbol(string upcase command)
或正确大小写的intern命令。请记住,CL区分大小写,而默认读取器是大小写转换。实际上,
find symbol
返回了
命令:| function |:EXTERNAL
,尝试应用此函数时会出现错误。我最近在学习软件包和系统,也许问题出在定义上。以下是三个定义的代码:您应该确保您的软件包(游戏和命令)不使用其他标准软件包,也不从中继承。我从昨天开始尝试,但仍然没有找到解决方案。我的game.asd文件上的代码是:
(asdf:defsystem“game”:依赖于(#:cl ppcre):组件(:file“game”)(:file“commands”))
commands.lisp文件的开头是:
(defpackage:commands(:use:cl)(:export“end”“sheet”“status”“save”“restore”“reload”“location”“inventory”“)
而game.lisp文件的开头是:
(defpackage:game(:use:cl:cl-ppcre))
我是否需要使用软件包中的
功能?commands.lisp从game.lisp调用一些函数,而游戏调用commands您的函数不返回
apply
的值。您的函数不返回
apply
的值。