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

String 有没有办法从Clojure中另一个函数的列表中创建函数中的字符串?,string,list,clojure,char,String,List,Clojure,Char,我对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))))) (se

我对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-char '(\h \e \l \l \o))
我的想法是从函数send开始,作为一个参数,写一个字符列表,如下所示:

(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-char '(\h \e \l \l \o))
带有get sent的receive函数一次发送一个字符,并使用str将它们添加到一起,我的最终输出是:“hello”

当我尝试运行代码时,出现以下错误: automata.core/send-char(core.clj:44)处的执行错误(ClassCastException)。 类java.lang.String不能强制转换为类clojure.lang.IFn(java.lang.String位于加载程序“bootstrap”的模块java.base中;clojure.lang.IFn位于加载程序“app”的未命名模块中)


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

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

((receive ...
请记住,在Clojure中,左括号表示“函数调用”,字符串不是函数(函数
receive
返回字符串)

如果要在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")
    ))

以上是基于。一定要学习。

我不确定concatenate是否是正确的单词(英语不是我的第一语言),但对于这个问题,我必须解决,它需要两个函数,一个有字符列表,另一个将它们连接在一起。我不知道是因为不变性还是类似的原因,但我不确定我做错了什么。这能回答你们的问题吗?