gpt4 book ai didi

lisp - Common Lisp 中的可参数化返回

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:10 25 4
gpt4 key购买 nike

我正在学习 Common lisp 中的 block ,并做了这个例子来了解 block 和 return-from 命令是如何工作的:

 (block b1 
(print 1)
(print 2)
(print 3)
(block b2
(print 4)
(print 5)
(return-from b1)
(print 6)

)
(print 7))

它将按预期打印 1、2、3、4 和 5。将 return-from 更改为 (return-from b2) 它将打印 1、2、3、4、5 和 7,正如人们所期望的那样。

然后我试着把它变成一个函数并参数化返回值上的标签:

 (defun test-block (arg)  (block b1 
(print 1)
(print 2)
(print 3)
(block b2
(print 4)
(print 5)
(return-from (eval arg))
(print 6)

)
(print 7)))

并使用 (test-block 'b1) 来查看它是否有效,但它没有。有没有办法在没有条件的情况下做到这一点?

最佳答案

使用像 CASE 这样的条件来选择要返回的 block

推荐的方法是使用 case 或类似的方法。 Common Lisp 不支持 block 的计算返回值。它也不支持计算的 go

使用case条件表达式:

(defun test-block (arg)
(block b1
(print 1)
(print 2)
(print 3)
(block b2
(print 4)
(print 5)
(case arg
(b1 (return-from b1))
(b2 (return-from b2)))
(print 6))
(print 7)))

无法根据名称计算词法 go 标签、返回 block 或本地函数

CLTL2 谈到了 go 构造的限制:

Compatibility note: The ``computed go'' feature of MacLisp is not supported. The syntax of a computed go is idiosyncratic, and the feature is not supported by Lisp Machine Lisp, NIL (New Implementation of Lisp), or Interlisp. The computed go has been infrequently used in MacLisp anyway and is easily simulated with no loss of efficiency by using a case statement each of whose clauses performs a (non-computed) go.

因为 goreturn-from 等功能是词法范围的结构,所以不支持计算目标。 Common Lisp 无法在运行时访问词法环境并查询它们。例如,本地功能也不支持此功能。不能在某些词法环境中获取名称并请求具有该名称的函数对象。

动态替代:CATCH 和 THROW

catchthrow 通常效率较低且范围动态的替代方法。在那里计算标签。

关于lisp - Common Lisp 中的可参数化返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46994065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com