当前位置: 首页 > 知识库问答 >
问题:

如何在REPL中分解结构?

葛成双
2023-03-14

假设我有一个函数(remove bad nodes g)返回如下序列:

[updated-g bad-nodes]

其中updated-g是删除了坏节点的图,而bad-node是包含删除节点的集合。

作为函数的参数或let中的参数,我可以将其分解如下:

(let [[g bads] (remove-bad-nodes g)]
  ...)

但这只定义了局部变量。我如何在REPL中做到这一点,以便在将来的命令中,我可以将更新的图形引用为g,将删除的节点引用为bads?首先想到的是:

(def [g bads] (remove-bad-nodes g)

但这不起作用,因为def需要它的第一个参数是符号。

注意,我不是在问为什么def没有像let这样的语法;已经有一个问题了。我想知道在REPL中使用返回“多个值”的函数有什么方便、实用的方法。如果在正常的Clojure实践中,由于您做了其他事情,因此没有必要在REPL中破坏结构,那么解释一下这可能是一个有用的答案。我最近经常碰到这个问题,这就是为什么我要问这个问题。通常,但并非总是,这些函数会返回某个内容的更新版本以及其他一些信息。在产生副作用的代码中,函数将修改对象并只返回一个值(示例中是删除的节点),但显然这不是间接的方式。

共有3个答案

微生昌勋
2023-03-14

注意:

user=> (def results [1 2 3])
#'user/results
user=> (let [[light burnt just-right] results] (def light light) (def burnt burnt) (def just-right just-right))
#'user/just-right
user=> light
1
user=> burnt
2
user=> just-right
3
贲功
2023-03-14

用REPL进行解构没有什么独特之处。你的问题的答案基本上与这个问题相同。我认为你的选择是:

(let [[light burnt just-right] (classify-toasts (make-lots-of-toast))]
  (prn light burnt just-right))

定义各个值:

(def result (classify-toasts (make-lots-of-toast)))
(def light (nth result 0))
(def burnt (nth result 1))
(def just-right (nth result 2))

或者编写一个宏来执行def为您工作。

如果您的函数总是返回一个3元组/向量,您也可以考虑使用不同的表示法,例如,您也可以从“分类祝酒”返回一个映射:

{:light 1, :burnt 2, :just-right 3}

然后,当您需要其中一个值时,可以在需要的任何位置使用关键字来分解地图:

(:light the-map) => 1
武骁
2023-03-14

我认为在repl中使用这些函数的方法就是不要定义中间结果,除非它们特别有趣;要获得足够有趣的中间结果,将它们定义为一个名称或在一个分解表单中写入多个定义都不是什么大问题。

例如,而不是

(def [x y] (foo))
(def [a b] (bar x y))

你可以写

(let [[x y] (foo),
      [x' y'] (bar x y)])
  (def a x') ; or maybe leave this out if `a` isn't that interesting
  (def b y'))

这样做的一个很好的副作用是,您在repl中玩的时候编写的代码看起来与将来添加到源文件中的代码非常相似,您肯定不会一遍遍地定义东西,而是将它们分解,传递给函数,等等。将您在repl中学到的信息改编成真实的程序会更容易。

 类似资料:
  • 问题内容: 我有一个ES6模块。将其作为参数执行即可: 是模块的输出。 与此相反,REPL中的以下输入等待进一步的输入: 我不明白为什么。 与以下相同: 尝试导致: 那么,如何在Node.js REPL中导入ES模块? 问题答案: 目前这是不可能的。ES模块应该从ES模块范围导入,而REPL不被认为是其中之一。随着时间的推移,这会有所改善,因为ES模块的支持是实验性的。在Node模块实现中和的使用

  • 问题内容: 我想评估 作为一个块,而不是逐行评估 有没有简单的方法可以将提示移至下一行? 问题答案: 节点v6.4具有一种模式。在repl提示符下,您可以输入多行。 例 以下是所有特殊repl命令的文档 https://nodejs.org/api/repl.html#repl_commands_and_special_keys

  • 我在Emacs中使用Clojure和苹果酒REPL。 在苹果酒REPL中有可能有多行功能吗?我该怎么做呢?

  • 我已经下载了代数鸟,我想使用这个库在Scala解释器中试用一些东西。我如何实现这一点?

  • 问题内容: 我将书名存储在elasticsearch中,它们都属于许多商店。像这样: 如何获取所有书籍并按标题分组…以及每组一个结果(一组具有相同标题的行,这样我就可以获得所有ID和存储)? 基于上面的数据,我想获得两个具有所有ID的结果并将其存储在其中。 预期成绩: 问题答案: 在Elasticsearch中无法找到您想要的东西,至少在当前版本(1.1)中无法实现。 对于此功能,还有很长的悬而未

  • 我试图在我的一个项目中使用Clojure与emacs和苹果酒,并且在执行我的代码时经常发生异常。当发生异常时,苹果酒为我提供了一个堆栈跟踪,但通常这不足以快速识别出了什么问题。我正在寻找一些方法,使CIDER初始化一个REPL当异常发生时,这将允许我检查异常发生点的本地值,甚至可能改变一些值,并从该点继续执行。Clojure、Emacs和苹果酒有可能吗?