【问题标题】:What's the lisp equivalent of System.exit(0)?System.exit(0) 的 lisp 等价物是什么?
【发布时间】:2022-04-05 06:59:15
【问题描述】:

假设我在多个 mapcar 函数中,并且找到了成功的终止条件。我想停止执行其余代码。

在java中,我可以做 System.exit(0);

lisp 有类似的东西吗?

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    MAPCAR不适用于迭代数据并在找到成功的终止条件时退出。

    Common Lisp 提供MAPC,类似于MAPCAR,但不累加结果。另见函数MAP

    此外,Common Lisp 还提供了许多函数,例如 FINDFIND-IFFIND-IF-NOT、...

    对于流控制,Common Lisp 有 RETURNRETURN-FROMCATCHTHROW 等等。

    【讨论】:

      【解决方案2】:

      System.exit() 的等价物在像 Lisp 这样面向 REPL 的环境中没有意义;它可能存在,但不会让你的函数返回一个值。

      如果您的代码结构合理,(return-from) 可能会满足您的需求。

      【讨论】:

      • 我所做的已经足够好了。我在一个带有双嵌套 mapcar 的函数中,每个 mapcar 都有一个 lambda。通过提及封闭函数的名称,这就成功了。
      【解决方案3】:

      在这种情况下,这可能不是合适的解决方案(使用 Dougal 的答案从嵌套循环/调用返回),但为了完整起见,System.exit(0); 的字面意思相当于 Portable Exit

      如您所见,它在不同的实现中完全不同,因为它不是标准的一部分。

      【讨论】:

        【解决方案4】:

        这是一个适用于大多数情况的助手。它允许您退出或不退出,并在标准输出中为您提供明确的消息:

        (defun _exit (&optional s)
          "Print and exit"
          (if s
             (error (format "_exit called - %s\n" s)) 
             (error "_exit called")
          )
        )
        
        

        用法:

        (_exit "testing 123")
        

        程序退出前的输出:

        > _exit called - testing 123
        

        这将退出所有函数并终止脚本。

        【讨论】:

          猜你喜欢
          • 2011-05-13
          • 1970-01-01
          • 2011-05-31
          • 2019-12-04
          • 2016-09-16
          • 2016-08-25
          • 2014-05-08
          • 2016-06-16
          • 1970-01-01
          相关资源
          最近更新 更多