gpt4 book ai didi

functional-programming - 经验丰富的计划者,letcc 和诡计

转载 作者:行者123 更新时间:2023-12-04 06:43:13 25 4
gpt4 key购买 nike

这里有几个问题,关于 letcc在 The Seasoned Schemer 中使用。

(define (intersect-all sets)
(letcc hop
(letrec
((A (lambda (sets)
(cond
((null? (car sets)) (hop '())
((null? (cdr sets)) (car sets))
(else
(intersect (car sets)
(A (cdr sets)))))))
; definition of intersect removed for brevity
(cond
((null? sets) '())
(else (A sets))))))
  • 我想我明白了letcc实现了,这基本上类似于 catchthrow在 ruby​​(和看似 CL)中,这基本上意味着可以通过调用任何命名的 letcc 来缩短整个代码块是。这感觉就像我在这一系列短书中遇到的最不“实用”的东西,它让我觉得使用它有点犹豫,因为我想学习一种好的实用风格。我是不是误会了letcc ,或者它不是真正的函数式编程概念,只是为了提高性能而存在?我可以在一些例程中间然后突然进入代码中的另一个点的整个想法感觉有点不对……就像在 Java 中滥用 try/catch 来进行程序流一样。
  • letcc我在 OS X 中安装的 guile (1.8.7) 版本中似乎不存在。我应该在 guile 中寻找它的另一个名称吗?
  • 如果我误解了letcc通过将它与 Java 中的 try/catch 或 ruby​​ 中的 catch/throw 进行比较(这不是异常处理,只是为了清楚,对于非 ruby​​ 主义者),它在功能级别上究竟是如何工作的?它能否以更长、更复杂的方式表达,让我相信它毕竟是功能性的?
  • 最佳答案

  • “功能性”有多种含义,但没有任何通俗的含义以任何方式与延续相矛盾。但是它们可能被滥用来创建难以阅读的代码。它们不是可以“被滥用于程序流”的工具——它们是程序流工具。
  • 帮不了你。我知道 Guile 有半新的续集,但我不知道情况如何。绝对应该有call-with-current-continuation , 通常也使用更友好的名称 call/cc , 和 let/cc是一个可以用 call/cc 构建的简单宏.

    我可以告诉你,在 Racket 中有一个 let/cc 与一堆 others builtins 一起内置在 same family ,另外还有一个 whole library各种控制操作符(带有广泛的引用文献列表。)。
  • let/cc 的简单用法确实类似于 catch/throw 之类的东西——更具体地说,这种延续通常被称为“转义延续”(或有时“向上”)。这是您在该代码中的一种用途,通常用于实现 abortreturn .

    但是 Scheme 中的延续是可以在任何地方使用的东西。对于显示这种差异的非常简单的示例,请尝试以下操作:
    (define (foo f) (f 100))
    (let/cc k (+ (foo k) "junk") (more junk))
  • 最后,如果你想了解更多关于 continuation 的内容,可以查看 PLAI 的相关部分。 , 还有一个 brief by-example overview Matthew Might 写的,你可以看到一些 class notes我写的那篇文章是基于 PLAI 的,其中一些例子是受后一篇文章启发的。
  • 关于functional-programming - 经验丰富的计划者,letcc 和诡计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103852/

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