访问Scheme中的调用堆栈深度

2024-04-11

为了演示尾递归的有效性,我想要一种在Scheme中动态访问调用堆栈深度的方法。

有没有办法做到这一点?如果没有,有没有办法在其他主要函数语言(OCaml、Haskell 等)中做到这一点?


Racket 允许您在调用堆栈中存储值。 您可以使用它来跟踪深度。 我将这样做:

#lang racket
;;; This module holds the tools for keeping track of
;;; the current depth.
(module depth racket
  (provide (rename-out [depth-app #%app])
           current-depth)

  (define (extract-current-continuation-marks key)
    (continuation-mark-set->list (current-continuation-marks) key))

  (define (current-depth)
    (car (extract-current-continuation-marks 'depth)))

  (define-syntax (depth-app stx)
    (syntax-case stx ()
      [(_depth-app proc args ...)
       #'(let ([p  (with-continuation-mark 'depth (+ (current-depth) 1) 
                     proc)]
               [as (with-continuation-mark 'depth (+ (current-depth) 1)
                     (list args ...))])
           (apply p as))])))

;;; Importing the #%app from the depth module will override
;;; the standard application to use depth-app which keeps
;;; track of the depth.
(require 'depth)

(with-continuation-mark 'depth 0  ; set the initial depth to 0
  (let ()
    ;;; Example:  foo is tail recursive
    (define (foo n)
      (displayln (list 'foo n (current-depth)))
      (if (< n 5)
          (foo (+ n 1))
          'done))

    ;;; bar is not tail recursive
    (define (bar n)
      (displayln (list 'bar n (current-depth)))
      (if (< n 5)
          (cons n (bar (+ n 1)))
          '()))

    ;;; Call the examples
    (foo 0)
    (bar 0)))

输出是:

(foo 0 2)
(foo 1 2)
(foo 2 2)
(foo 3 2)
(foo 4 2)
(foo 5 2)
(bar 0 2)
(bar 1 3)
(bar 2 4)
(bar 3 5)
(bar 4 6)
(bar 5 7)
'(0 1 2 3 4)

输出显示深度没有增加foo它确实在bar.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问Scheme中的调用堆栈深度 的相关文章

  • 如何在方案中向后打印字符串?

    我知道如果我按照以下方式编写方案代码并输入 单词 a b c 它将以相同的顺序输出列表 您能告诉我是否有一种方法可以以相反的顺序打印出来 例如 列出 c b a 它需要是我以相反顺序打印出来的用户输入 所以 我不能称之为 反向 a b c
  • Java Stream:通过布尔谓词分为两个列表

    我有一个清单employees 他们有isActive布尔字段 我想分employees分为两个列表 activeEmployees and formerEmployees 是否可以使用 Stream API 来实现 最尖端的方法是什么 C
  • 哪种函数式编程语言在 Eclipse 中提供最好的支持?

    作为一项练习 我的团队正在考虑学习函数式编程 选择一种语言的因素之一是它在 Eclipse 中的支持 任何带有 Eclipse 插件的语言都可以 但是哪种语言提供最好的免费插件呢 额外问题 该语言的最佳在线 书籍教程 我不知道它是否是最好的
  • 任何遍历嵌套字典的函数式编程方法?

    我正在尝试找到更好的方法来实现这一点 d a b c 4 l a b c for x in l d d x print d 4 我正在学习函数式编程 所以我只是尝试随机出现的例子 Use reduce http docs python or
  • 如何使用非类型化语言中的 Reader Monad 在整个组合中隐式地线程化参数?

    我知道裸读者单子仅包含两个功能 const chain g gt f gt x gt f g x x const of x gt gt x 但我对它如何工作或如何应用没有任何直觉 知道 is 用于在整个组合中隐式地线程化参数并没有多大帮助
  • 有没有办法在 gdb 中设置一个以调用堆栈为条件的断点?

    我正在 Linux 上的 gdb 7 1 中调试 C 我有一个函数a 代码中很多地方都会调用它 我想在其中设置一个断点 但前提是它是从b 有什么办法可以做到吗 有没有办法做到这一点 只有当b 被叫自c 等等无穷无尽 Update 现在有一个
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • 方案语言:合并两个数字

    如何将列表中的两个整数合并为一个 方案中 例子 11 223 gt 11223 假设列表恰好有两个元素 并且都是数字 define merge numbers lst let 1st number gt string first lst 2
  • iPhone 开发——performSelector:withObject:afterDelay 还是 NSTimer?

    重复方法调用 或消息发送 我猜合适的术语是 x秒 是使用 NSTimer NSTimer 的 ScheduledTimerWithTimeInterval target selector userInfo repeats 还是让该方法在最后
  • 使用参与者模型进行基于时间的模拟

    我们有一个单线程应用程序 可以模拟数十万个对象随着时间的推移与共享内存模型的交互 显然 它无法在多 CPU 硬件上进行扩展 在阅读了一些有关基于代理的建模和函数式编程 参与者模型的内容后 我正在考虑使用消息传递范例进行重写 这个想法非常简单
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 什么是(函数式)反应式编程?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我读过维基百科的文章反应式编程 http en wikipedia org wiki Reac
  • 我应该选择哪种函数式编程语言作为第一种函数式编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想学习一种函数式编程语言 以了解不同的编程范例 我的编程背景 Java 我刚刚通过了 SCJP 考试 一些 ruby 和非常有限的 Rails
  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • 在 Clojure 中退出 Recur 循环

    我想跳出下面的循环 并在第 10 行计算结果为 true 时返回最佳最小移动 我查看了 print 语句的输出 当第 10 行的计算结果为 true 时 它 找到了我正在查找的数据 但仍然重复出现 在 Clojure 中 有没有办法在语句计
  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2

随机推荐

  • GitHub - 当非默认分支与主分支合并时,PR 链接的问题不会被关闭

    I have main作为默认分支和dev作为非默认 我创建了一个问题和一个 PR 以从新的合并temp分支到dev分支 在公关中 我曾提到过Resolves 1 当我将 PR 合并到dev分支 问题 1不会关闭 因为它是非默认分支 然后我
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 如何在本地执行 Capistrano 任务?

    我定义了一个自定义 Capistrano 任务 该任务应该在本地运行 在我的开发计算机上 desc Push code to Dreamhost task push do run git push dreamhost end 但是当我尝试跑
  • python dask DataFrame,支持(可并行化)行应用吗?

    我最近发现dask http dask pydata org en latest index html旨在成为一个易于使用的 python 并行处理模块 对我来说最大的卖点是它可以与熊猫一起使用 在阅读了其手册页后 我找不到一种方法来完成这
  • 如何获取Python字典中的最高键?

    d 苹果 9 橙子 3 葡萄 22 如何返回最大的键 值 编辑 如何制作一个按最大到最低值排序的列表 gt gt gt d apple 9 oranges 3 grapes 22 gt gt gt v k max v k for k v i
  • 包 inputenc 错误:Unicode char \u8:β 未设置为与 LaTeX 一起使用

    我在 Bibdesk 中的参考文献之一包含一些拉丁 希腊字符 例如 我在 TEXMAKER 中使用参考时收到错误 包 inputenc 错误 Unicode char u8 未设置为与 LaTeX 一起使用 我该如何设置它才能工作 尽管使用
  • 数据按用户分组为每周、每月

    我有一个高库存折线图 显示给定股票的每日和每周股价 问题是 当数据数组足够大时 每日数据点将被 采样 为每周数据点 而每周数据点将被采样为每月数据点 有什么方法可以根据需要将用户设置为每周或每月 提前致谢 检查一下数据分组 http www
  • 返回时如何刷新片段 UI

    我是 Android 新手 正在学习片段的知识 并为其制作了一个演示 因为我有一个片段 我们可以从中转到另一个活动 那里正在执行一些计算 然后我们当时回到片 段我想将该计算值显示到我的片段的文本视图中 那么我应该使用哪种生命周期方法来执行此
  • TypeError:无法解压不可迭代的 NoneType 对象

    我知道这个问题之前已经被问过 但我似乎无法让我的问题工作 import numpy as np def load dataset def download filename source http yaan lecun com exdb m
  • 如何从store方法获取上传的图片名称

    当我在 Laravel 中存储图像时 path request gt file myImage gt store public src 它返回完整路径 但如何仅获取给定的文件名 这是返回路径的示例 public src ltX4COwEmv
  • JPackages JavaFX + Spring boot 无法启动

    我正在尝试使用 Spring Boot 构建 JavaFX 应用程序并使用 jpackage 进行部署 当使用javafx maven plugin javafx run命令 我可以看到项目启动 但在将其构建为 msi安装程序 安装并启动
  • 使用 rvmrc 或 ruby​​-version 文件通过 RVM 设置项目 gemset?

    我使用RVM Ruby 版本管理器 https rvm io 为我的每个 Rails 项目指定 Ruby 版本和一组 gem 我有一个 rvmrc文件来自动选择 Ruby 版本和 gemset 每当我cd进入项目目录 安装 RVM 1 19
  • git-p4 正在吃掉我的图像文件

    所以 我可以使用 git p4 从 p4 导入 没有任何问题 一切似乎都正常 但我的 PNG 文件 也许还有其他文件 正在损坏 我读过有关 gitattributes 和行结束问题的内容 但我所做的一切似乎都无法改变最终结果 破碎的图像 我
  • 如何使用 joblib.dump 在 s3 上保存 sklearn 模型?

    我有一个 sklearn 模型 我想使用 joblib dump 将 pickle 文件保存在我的 s3 存储桶上 I used joblib dump model model pkl 将模型保存到本地 但我不知道如何将其保存到 s3 存储
  • C、C++ 初始化中的排序

    考虑以下初始化 C C int a f g struct int x y foo f g C struct goo goo int x int y goo b f g goo c f g C 11 goo d f g 是执行顺序f and
  • 将内核内置模块替换为可加载模块

    我开发了一个内核模块来管理 nf4 标签作为字符设备 我在内核之外开发了这个模块 并在开发阶段将其编译为可加载内核模块 即 ko 进行了测试 一旦驱动程序功能正常且足够稳定 我就使用补丁将其插入 Linux 内核源代码 v4 9 30 以便
  • 可执行的 Spring Boot 2 jar

    我尝试安装我的 Spring Boot 应用程序 第一步 我尝试创建一个可执行 jar 如下所述 https docs spring io spring boot docs current reference html deployment
  • Django CreateView过滤选择字段中的外键

    我需要一些有关 Django 2 和 Python 3 的帮助 我正在使用一个CreateView在我的数据库中添加新记录 但我需要为我的记录创建一个过滤器Aviso表单页面使选择字段 fieldturma 仅显示其中的实例represen
  • 在 C# 中以科学记数法显示 IEEE-754 四倍精度 (binary128) 浮点值

    我正在尝试将原始二进制数据从线程上下文转换为人类可读的格式 并且在尝试转换时出现空的情况四精度浮点 http en wikipedia org wiki Quadruple precision floating point format I
  • 访问Scheme中的调用堆栈深度

    为了演示尾递归的有效性 我想要一种在Scheme中动态访问调用堆栈深度的方法 有没有办法做到这一点 如果没有 有没有办法在其他主要函数语言 OCaml Haskell 等 中做到这一点 Racket 允许您在调用堆栈中存储值 您可以使用它来