【问题标题】:Does clooj evaluates line by line or by the whole lineclooj 是逐行还是整行评估
【发布时间】:2013-01-01 19:26:32
【问题描述】:

当我评估整个文件时,它似乎没有问题。

(ns ShipDataRecord
  (:import [java.util.Date]
   [org.joda.time.DateTime]
   [org.joda.time.Seconds]
   [org.joda.time.format.*]
   [semsav.RecordSplitter]))
(require '[clojure.data.csv :as csv]
         '[clojure.java.io :as io])

(defrecord Record [W1 W2 W3])

(defn read-csv [fname count]
  (with-open [file (reader fname)]
    (doall (take count (map (comp first csv/read-csv)
                            (line-seq file))))))

(map #(apply ->Record %) (read-csv "test.csv" 1))

但是,当我逐行评估时,它似乎给了我一个问题。

因此在评估文件后,我在 REPL 中运行了这一行

(:W3 (first Record))

但它给了我一个编译器异常 IllegalArgumentException 不知道如何从:java.lang.Class clojure.lang.RT.seqFrom (RT.java:494) 创建 ISeq。

我已经用谷歌搜索了,但我似乎找不到问题所在。我在另一个问题中问过这个问题,但是由于单词太长,我必须创建一个新问题

【问题讨论】:

    标签: ide clojure


    【解决方案1】:

    (:W3 (first Record)) 中,符号Record 代表类Record。我猜从您之前的帖子中,您只想从(map #...) 生成的记录集合的第一条记录中获取:W3 字段。因此,您只需从 map 表达式或可以存储表达式结果的变量中获取此值:

    (:W3 (first (map #(apply ->Record %) (read-csv "1.csv" 1))))
    

    (def records (map #(apply ->Record %) (read-csv "1.csv" 1)))
    
    (:W3 (first records))
    

    【讨论】:

    • 我想问一下:w3的值现在是否映射到记录了?请原谅我的问题,因为我不习惯函数式编程
    • 变量 records 包含由 map 函数创建的 Record 类对象的集合。因此,通过first 函数,您可以获得该集合的第一个对象。通过:W3,您可以从此对象中获得:W3 字段。
    • 不断收到此错误:CompilerException java.lang.RuntimeException: Unable to resolve symbol:->Record in this context, compile:(ShipDataRecord.clj:97) 已尝试使用此行(println (:W3 (first records))) 但它似乎也不起作用
    • (doc defrecord) 中我们看到“...给定(defrecord TypeName ...),将定义两个工厂函数:->TypeName,获取字段的位置参数,以及map->TypeName ,将关键字映射到字段值..."。所以我猜你没有评估(defrecord ...)
    • 即使通过添加 '(println(:W3(first records)) ' 来评估整个文件也应该打印出 W3 的值,但它只是在没有任何输出的情况下进行评估
    猜你喜欢
    • 2012-06-26
    • 2013-09-17
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多