使用 common lisp 展平列表

2023-11-29

我正在读 Paul Graham 写的《On Lisp》一书。在第 4 章“实用函数”中,他给出了对列表进行操作的小函数的示例,这在编写较大的程序时会很有帮助。

其中之一是flatten。给定任意级别的嵌套列表作为参数,展平将删除所有嵌套元素并将它们放在顶层。

以下是我实现扁平化的尝试:

(defun flatten (lst)
  (labels ((rflatten (lst1 acc)
                     (dolist (el lst1)
                       (if (listp el)
                         (rflatten el acc)
                         (push el acc)))
                     acc))
    (reverse (rflatten lst nil))))

但上述函数没有正确展平列表。

; returns (1) instead of (1 2)
(print (flatten '(1 (2))))
(1)

调用该函数(1 (2))回报(1)代替(1 2).

我找不到我的扁平化实施有什么问题。这是我使用的方式吗labels?或者是我使用的方式dolist宏?这dolist宏总是返回nil。但这并不重要,因为我正在使用累加器acc存储展平列表。


push更改范围内的符号绑定。因此递归(rflatten el acc)有它自己的acc这是那里的结果,但您不对返回的结果执行任何操作,并且它不会改变被调用者acc.

也许是一个(setf acc (rflatten el acc))会解决这个问题:

(defun flatten (lst)
  (labels ((rflatten (lst1 acc)
             (dolist (el lst1)
               (if (listp el)
                   (setf acc (rflatten el acc))
                   (push el acc)))
             acc))
    (reverse (rflatten lst nil))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 common lisp 展平列表 的相关文章

  • 使用局部特殊变量

    为了方便原型设计 我依赖于许多全局变量 这些变量在整个代码中大量使用 但现在我想让其中一些成为本地的 但动态的 在本地声明它们是否有任何重大缺点 例如 效率等 special而不是全球 特殊变量不受欢迎的功能包括 缺乏参考透明度 这使得对代
  • 展平数组:保持索引、值等于数组中的位置

    我在尝试以特定方式展平数组时遇到了一些麻烦 这里有一个print r我想要展平的数组的视图 Array 1 gt Array 8 gt 1 9 gt 2 10 gt Array 15 gt Array 22 gt 1
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • SLIME 和 SWANK 入门:Lisp 连接意外关闭:连接被远程对等点断开

    我试图使用 slime connect 函数通过 sbcl 访问远程服务器 我遵循了 slime mov 电影中的所有步骤马可 巴林格 http www guba com watch 30000548671但在为 slime 创建 ssh
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 无需递归即可展平多个嵌套数组的数组 - javascript

    也许这是一个愚蠢的问题 但我无法意识到是否可以在不使用递归的情况下展平多维数组 我用递归编写了一种解决方案 function transform arr var result arr forEach flatten function fla
  • 将数字转换为英文字母列表

    我有下面的函数 它将数字输入转换为这些数字的部分翻译的单词输出 使用乘积和商 它将数字的单词表示相加 同时将数字分组 例如 number name 87969087 gt 87 million 969 thousand 87 number
  • 如何在参数上使用 .reduce() 而不是特定的数组或对象?

    我想定义一个函数 flatten 将多个元素展平为一个数组 我知道以下是不可能的 但本质上我想这样做 var flatten function var flattened arguments reduce function acc elem
  • java中的单链表和双向链表?

    在java中 哪个集合接口可以有效地实现单链表和双向链表 请问代码示例吗 毫不奇怪 实现双向链表的正确接口是 LinkedList 看Java文档 http docs oracle com javase 8 docs api java ut
  • 链表算法查找总和为 10 的对

    您能否建议一种算法来查找链表中加起来为 10 的所有节点对 我想出了以下内容 算法 比较每个节点 从第二个节点开始 每个节点从头节点开始直到前一个节点 在当前比较的节点之前 并报告所有此类对 我认为这个算法应该可以工作 但是它肯定不是最有效
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 如何在 Lisp 中生成一系列佩尔数而不是特定的数

    如何使用 cons 或其他方式打印列表佩尔数 https en wikipedia org wiki Pell number直到第N个数 defun pellse k if or zerop k k 1 k 2 pellse k 1 pel
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • 以表格形式连续调用/评估?

    大家好 简单的问题 使用 XLISP 编写程序 但我似乎遇到了一个我似乎无法解决的简单基本问题 也许有人有一个快速解决方案 我正在尝试编写一个 if 语句 该语句的 then 子句评估多种形式并返回最后一种形式的值 在示例中 setq PO
  • 我的程序替换了链表中所有节点中的所有字符串数据类型

    我有一个程序 基本上将历史记录 节点 添加到员工记录 链接列表 中 这是我的代码 include
  • 当给定块大小时反转单链表

    有一个单连接链表 并给出了块大小 例如 如果我的链表是1 gt 2 gt 3 gt 4 gt 5 gt 6 gt 7 gt 8 NULL我的块大小是4然后反转第一个4元素 然后是第二个 4 个元素 问题的输出应该是4 gt 3 gt 2 g
  • 如何在 Ubuntu Karmic 上安装 LFE?

    Erlang 已经安装 dpkg l grep erlang ii erlang 1 13 b 3 dfsg 2ubuntu2 Concurrent real time distributed function ii erlang appm
  • 用于在链表中查找结点的生产代码

    我在一次采访中被问到这个问题 我被要求编写代码 用于在 O 1 空间和线性时间的生产环境中在链表 其形式为 Y 形式 双臂不一定相等 中查找结点 我想出了这个解决方案 我以前在某处见过 1 Measure lengths of both l

随机推荐

  • 关于 Firemonkey (Delphi) 中的 TidHttp、mshtml、ActiveX、COMObj

    我正在审查以下有趣的文章 使用 Delphi 从 HTML 页面中提取链接 我在 Firemonkey 中进行了测试 它非常有用 但是此代码使用来自 Mshtml ActiveX 和 COMObj 的对象 所以我的问题是 上面的这些对象是否
  • 在新线程中启动异步函数

    我正在尝试创建一个不和谐机器人 我需要在另一个新线程中运行异步函数 因为主线程需要运行另一个函数 不和谐客户端 我正在努力实现的目标 This methods needs to run in another thread async def
  • 如何在iphone中设置html+css添加

    如何在iphone中设置html css添加 webView UIWebView alloc initWithFrame CGRectMake 0 0 320 458 webView delegate self self view addS
  • Notepad++可以将正则表达式匹配的字符串转换为小写吗?

    我有一个 C 源文件 它使用 getMemberName 形式的函数返回成员数据 相反 我想使用memberName 为了匹配需要更改的函数名称的实例 我使用以下正则表达式 s get A Z 问题是 我不知道如何用小写版本替换 2 的实例
  • Firebase ID 令牌在一小时后过期

    所以我正在使用redux saga在我的react native应用程序中并尝试使用刷新令牌但不起作用 所以我的方法是在app js中执行以下操作 以便专门针对每个请求获取令牌并强制刷新它 handleResponse async gt c
  • Django admin查看上传的照片

    我已经在 Django 中实现了照片上传 但在 Django 管理中查看它时遇到问题 模型 py class WorkPlacePhoto models Model file models FileField storage FileSys
  • 如何在 Android 中创建像 Apple Music App 这样的 UI 和控件?

    视频链接 我想创建视图和动画 例如苹果音乐应用程序在 iOS 中可用 但是 我想在 Android 中执行类似于上面的视频链接的操作 是否可以在 Android 中创建这样的视图 我怎样才能实现这个目标 这方面该如何进行呢 请分享任何链接和
  • 浏览器中并发文件下载的最大数量?

    两个相关问题 网页允许打开的最大并发文件数是多少 例如图像 CSS 文件等 我假设这个值在不同的浏览器中是不同的 也许每个文件类型 例如 我非常确定 javascript 文件一次只能加载一个 对吗 有没有办法可以使用javascript来
  • 在 lmer 输出上运行汽车方差分析后出现列表类型错误

    我正在尝试在 R 中做一个随机效应模型 我想运行一个anova在输出中 我浏览了一些教程并复制了他们的示例 但我的不起作用 我在 Anova 上不断收到以下错误 1 length names which term sapply names
  • chrome和firefox之间的window.innerWidth不同?

    html body position absolute width 100 height 100 margin 0 padding 0 overflow hidden The window innerWidth从 FX 和 chrome 返
  • 将 devtools.js 的内容脚本添加到我的新面板

    我花了很长时间试图在我的内容脚本中获取代码来与我的面板对话 此扩展向开发工具添加了一个新面板 从我的内容脚本中 我可以执行以下操作 chrome extension sendMessage greeting hello function r
  • 如何在DatePickerDialog.OnDateSetListener中获取OnClick?

    我正在使用以下方法弹出对话框来选择日期 private DatePickerDialog OnDateSetListener mDateSetListener new DatePickerDialog OnDateSetListener p
  • 将空 XML 元素反序列化为 Guid.Empty

    我在反序列化方面遇到一些麻烦
  • ocaml printf 函数:如果某些条件成立,则完全跳过格式化

    摘自ocaml 在对象的方法中公开 printf 函数 因此可以独立回答 我有以下 简化的 ocaml 代码 用于记录器 type log level Error Warn Info let ord lvl match lvl with E
  • 从namedtuple中获取特定对象的对象名

    我最近发现namedtuple并想用它来替换我讨厌的大类定义 但我很好奇是否有一种聪明的方法来检索我刚刚选择的值的对象名称 如果不清楚 请参阅下面的示例 MyStruct namedtuple MyStruct Var1 Var2 Var3
  • 在 Python 3 中使用 ANSI 序列确定终端光标位置

    我想编写一个小脚本 将图像打印到终端 usr lib w3mimgdisplay 就像在 mac osx 中一样lsi 因此 当脚本启动时 我需要实际的光标位置 或插入符号位置 到目前为止 我想出了用 ANSI 序列获取 shell 中光标
  • 如何使用 Group By 和自连接返回每日最低、最高、开盘价和收盘价结果集?

    SOLVED 堆栈溢出万岁 当我离开时 人们留下了 2 个解决方案 谢谢大家 为两个可行的解决方案分发业力的协议是什么 这是我回来发布的解决方案 它源自另一个 StackOver 解决方案 如何使用聚合函数在MySQL查询中获取分组记录的第
  • 可空对象必须有一个值#2

    我试图重用我一直使用的相同代码 但现在遇到错误 我正在循环访问各种用户表 并在其中执行以下操作 DateTime dcdt DateTime u DateCreated DateTime lldt DateTime u LastLogon
  • 如何使用js移动输入中的文本

    我只是使用 js 来设置文本输入的值 但是 当文本长度超过输入可容纳的长度时 多余的文本将隐藏在输入的右侧部分 如何像正常打字一样隐藏左侧区域多余的文字 原谅我糟糕的英语 当您执行此操作时 您的插入符位置位于文本的开头 您需要将插入符位置移
  • 使用 common lisp 展平列表

    我正在读 Paul Graham 写的 On Lisp 一书 在第 4 章 实用函数 中 他给出了对列表进行操作的小函数的示例 这在编写较大的程序时会很有帮助 其中之一是flatten 给定任意级别的嵌套列表作为参数 展平将删除所有嵌套元素