【发布时间】:2021-06-12 22:31:54
【问题描述】:
假设我们有一个结构如下的函数:
def f():
# ...
# some computations
# ...
if something_is_wrong_with_previous_computations:
return None
# ...
# some other computations
# ...
if something_is_wrong_with_previous_computations2:
return some_variable
#...
return result
在我看来,在函数中间使用 return 语句根本不起作用。如果我们使用某种 lispy 语言,我们将拥有 let(然后可以使用 let* 编写计算)语句,这将帮助我们轻松处理这些情况。不幸的是,我们这里没有。我们该怎么办?
- 模拟
let创建大量嵌套函数并就地调用它们? - 使用
Maybemonad 之类的东西还是其他类似的复杂东西? - 不要浪费我们的时间并强制编写它?
- 还有别的吗?
【问题讨论】:
-
你能举一个例子来说明你将如何在 LISP(任何方言)中做到这一点吗?我很好奇,因为我不知道 let 在这种情况下如何提供帮助并且想知道。
-
@YevhenKuzmovych “为了伟大的正义” ©。开个玩笑,更多的是为了学习,然后是为了生产
-
@jbmeerkat 好的,我同意,这不是关于
let,而是let*(方案):```(定义(f)(let*([v1 #| some-computation | #] [v2 #| some-computation-2 |#] #|etc|#) (if wrong1 Null (let* (#|some-more-computations|#) (if wrong2 some-var (let* ... )))))) ```(我希望你能读懂))) -
据我了解,Scheme 中的示例与您在 Python 中的问题中编写的代码非常相似,但返回除外。我认为这里的关键区别在于,在 Scheme 中“返回”是隐式的,但在 Python 中它们是严格明确的。您可以在 Python 中通过单次返回来执行此操作,但如果会更像 C 风格,则无法使用 pastebin.com/xgGD0iBn
-
不同之处在于 Lisps 是表达式语言:Python 不是。我的观点是,如果您尝试用非表达式语言编写程序,就好像它们是表达式语言一样……使用一种表达式语言比尝试将另一种语言扭曲成一种语言更容易。
标签: python functional-programming lisp