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

有没有办法从Clojure中另一个函数的列表中创建函数中的字符串?

公良阳波
2023-03-14

我对Clojure和函数式编程很陌生,我试图使用两个函数将一些字符连接到一个字符串中。我的想法基本上是这样的:

(defn receive [char-from-list]
  (str char-from-list))

(defn send-char [list-char]
  (if (empty? list-char)
    (receive nil)
    ((receive (first list-char))(send-char (rest list-char)))))

因此,我的想法是从函数send开始,并作为参数编写一个字符列表,如下所示:

(send-char '(\h \e \l \l \o))

带有get sent的receive函数一次发送一个字符,并使用str将它们添加到一起,我的最终输出是:“hello”。

当我尝试运行代码时,会出现以下错误:automata处的执行错误(ClassCastException)。核心/发送字符(核心clj:44)。类java。无法将lang.字符串转换为clojure类。lang.IFn(java.lang.String位于加载器“bootstrap”的模块java.base中;clojure.lang.IFn位于加载器“app”的未命名模块中)

我不确定是否有办法做到这一点或其他方法,但我不知道如何,请帮助。谢谢

共有1个答案

夏俊人
2023-03-14

错误是因为此处一行中有两个左括号:

((receive ...

请记住,在Clojure中,左paren表示“函数调用”,字符串不是函数(函数接收返回字符串)。

如果您有2件事要在Clojure中分组,则需要使用do表单,例如:

(defn send-char [chars]
  (if (empty? chars)
    (receive nil)
    (do
      (receive (first chars))
      (send-char (rest chars)))))

在确定了错误的来源之后,您最初的问题仍然非常模糊和未定义。以下是将字符序列连接到字符串的3种方法:

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [clojure.string :as str]))

(dotest
  (let-spy [chars (vec "hello")
            s0 (apply str chars)
            s1 (str/join chars)
            s2 (reduce str "" chars)
            ]
    (is= chars [\h \e \l \l \o])
    (is= s0 "hello")
    (is= s1 "hello")
    (is= s2 "hello")
    ))

以上内容基于我最喜欢的模板项目。一定要研究文档来源列表。

 类似资料:
  • 我可能是错的,但是在rethinkdb驱动程序中,lambda不知怎么地被编译成ast语法,这些语法被转换成js并发送到数据库。我相信我需要以某种方式显式地创建一个lambda。http://www.retinkdb.com/blog/lambda-functions/那么这个问题是如何在Clojure中将lambda实现为一个名为“lambda”的函数的呢?只显示如何使用函数,而不是lambda

  • 我正试图从包含1768张图片的列表中创建numpy数组。这是我的代码: 当运行它时,我面临这个错误: 有人能帮我解决吗?

  • 问题内容: 我一直在寻找这个问题的准确答案已有几天了,但是还没有任何好的结果。我不是编程的完整初学者,但即使在中级水平上也还不是。 当我进入Python的外壳程序时,键入:并且可以看到当前作用域(主块)中所有对象的所有名称,其中有6个: 然后,例如,当我声明一个变量时,它会自动添加到内置模块下的对象列表中,当我再次键入时,它现在显示: 函数,类等也是如此。 我如何删除所有这些新对象而不删除开始时可

  • 问题内容: 我不太明白为什么我不能将Int []从一个函数传递到另一个函数: 这给了我以下错误: 谢谢你的帮助! 问题答案: 中的参数称为 可变参数 。这意味着您可以传入该参数类型的可变数量,并且传入的所有内容都将转换为该类型的数组,以供您在函数中使用。 因此,内部的参数是一个数组,而不是所期望的一组参数。 您可能想要像这样重载以接受其中任何一个,因此您的平均函数可以调用适当的版本:

  • 创建一个作为给定单位的给定数量是很简单的: 但是对于没有这样的方法。最好的方法是什么? 我的情况是,我有一个单位和一个计数作为变量,所以不能简单地硬编码对Period::ofYear或类似的调用。 这是我想到的最干净的东西: 这是干净的,因为它避免了嵌入关于一个时期可以有什么单位的知识,尽管这可能过于纯粹。不过,对于这样一个简单的操作来说,它似乎太冗长了!

  • 我试图在Kotlin中使用公共接口函数(正如我在Java中学习的那样)。 为此我创建了我的方法 据我记忆所及,我应该能做 但这似乎是不可能的(尽管可以使用modifier1.apply{input}) 阅读更多关于它的信息,我发现: Kotlin:如何将一个函数作为参数传递给另一个? 所以我把我的方法签名改为: 在这里我可以做 我可以这样叫福 哪里 到目前为止,这似乎是可能的,但将函数引用设为nu