Clojure编译器错误

Clojure编译器错误,clojure,compiler-errors,Clojure,Compiler Errors,我正在开发一个clojure程序,其中包括以下代码行: (defn makeStruct "Take a line of input and return a starbucks-struct" [input] (let[(apply struct storeinfo (clojure.string/split input #","))] ) ) 我收到这个编译器错误: Exception in thread "main" java.lang.IllegalArgumentExcep

我正在开发一个clojure程序,其中包括以下代码行:

(defn makeStruct 
 "Take a line of input and return a starbucks-struct"
 [input]
 (let[(apply struct storeinfo (clojure.string/split input #","))]
 )
)

我收到这个编译器错误:

Exception in thread "main" java.lang.IllegalArgumentException: let requires an even number of forms in binding vector (clojureHW.clj:24)

我对clojure非常陌生,不完全确定我在做什么,但在本例中,输入是一个字符串,我将它拆分成一个向量来初始化我的结构。我是否错误地使用了let的语法?

let需要偶数形式,因为它将值绑定到局部变量:

(let [x 10,
      y (+ x 20)]
   ; do something with x and y here
   (* x y))
请阅读此处的文档:
let需要偶数个表单,因为它将值绑定到局部变量:

(let [x 10,
      y (+ x 20)]
   ; do something with x and y here
   (* x y))
请阅读此处的文档:

我认为您对lisp处理返回值和绑定的方式仍然存在误解

表达式中一对参数中的所有内容都返回一个值,该值可由另一个表达式中的参数使用或绑定到符号

你有这个

(apply struct storeinfo (clojure.string/split input #","))
这将返回值,因为只有一个表达式。这很简单,只要数一数她的父母就可以了


由于在let中没有其他内容,因此在let中有奇数个表单(表达式)。

我认为您对处理返回值和绑定的lisp方式仍有误解

表达式中一对参数中的所有内容都返回一个值,该值可由另一个表达式中的参数使用或绑定到符号

你有这个

(apply struct storeinfo (clojure.string/split input #","))
这将返回值,因为只有一个表达式。这很简单,只要数一数她的父母就可以了


由于let中没有其他内容,因此let中的形式(表达式)为奇数。

let表达式的“绑定”端可能只有符号和解构形式,例如向量和映射。
let
的绑定端无法计算像
(应用结构存储信息)

这样的表达式
let
表达式的“绑定”端只能有符号和分解形式,例如向量和映射。
let
的绑定端无法计算像
(apply struct storeinfo)

这样的表达式。是的,我了解这一点,并且已经浏览了该文档页面。我在let语句中计算了两个部分(apply struct storeinfo)和(split input#“,”),它有什么问题?(apply struct storeinfo)不是符号,就像我给你的示例中的x或y一样。顺便说一句,您有(apply struct storeinfo(clojure.string/split input#“,”),没有(apply struct storeinfo)和(split input#“,”)。按照我的理解,(apply struct storeinfo)将返回一个storeinfo结构,然后该结构将被以下语句拆分,(split input#“,”)是否允许在此处使用错误的关键字/操作?是的。也许您的意思是->或->>,例如,请参见。但是,如果(apply struct storeinfo)是将要执行的第一个表单,那么我希望storeinfo是您之前定义的东西,或者是makeStruct.Hey的一个参数。如果你还在看这篇文章,我还发布了另一个关于clojure编译器错误的问题。如果你不能回答,没有压力。谢谢你的帮助。是的,我理解这一点,并且已经阅读了文档页面。我在let语句中计算了两个部分(apply struct storeinfo)和(split input#“,”),它有什么问题?(apply struct storeinfo)不是符号,就像我给你的示例中的x或y一样。顺便说一句,您有(apply struct storeinfo(clojure.string/split input#“,”),没有(apply struct storeinfo)和(split input#“,”)。按照我的理解,(apply struct storeinfo)将返回一个storeinfo结构,然后该结构将被以下语句拆分,(split input#“,”)是否允许在此处使用错误的关键字/操作?是的。也许您的意思是->或->>,例如,请参见。但是,如果(apply struct storeinfo)是将要执行的第一个表单,那么我希望storeinfo是您之前定义的东西,或者是makeStruct.Hey的一个参数。如果你还在看这篇文章,我还发布了另一个关于clojure编译器错误的问题。如果你不能回答,没有压力。谢谢你的帮助。