误解Clojure需要

时间:2016-05-20 22:42:50

标签: import clojure

我有两个文件:enviro.clj和point.clj;两者都在同一个文件夹中。

我想将point.clj导入enviro.clj。

enviro.clj:

(ns game-of-life.enviro
  (:require [game_of_life.point :as point]))

(defrecord Enviro [cells dims])

(defn create-dead-enviro [width height]
  (Enviro.
    (replicate (* width height) :dead)
    (point/Point. width height)))

point.clj:

(ns game-of-life.point)

; A 2D point representing a coordinate, or any pair of numbers
(defrecord Point [x y])

通过此设置,Intellij(与Cursive)说它无法在point/Point.内解析create-dead-enviro。但它建议导入它。如果我允许它自动修复它,它会将enviro.clj的顶部更改为:

(ns game-of-life.enviro
  (:require [game_of_life.point :as point])
  (:import (game_of_life.point Point)))

从我读过的内容来看,import仅用于Java互操作来导入Java类;它不习惯" import"一个Clojure命名空间。

我在这里缺少什么?

修改

仍然没有。我将enviro.clj更改为:

(ns game-of-life.enviro
  (:require [game_of_life.point :as point]))

(defrecord Enviro [cells dims])

(defn create-dead-enviro [width height]
  (Enviro.
    (replicate (* width height) :dead)
    (->Point width height)))

我仍然得到一个"无法解决"错误。

1 个答案:

答案 0 :(得分:3)

如果您想使用(recordName. args) java互操作构造函数表单,这对于记录和仅需要导入它们的记录有一些特殊性。

如果您使用->Enviro辅助函数,则无需添加额外的导入。

user> (defrecord Enviro [cells dims])
user.Enviro

user> (->Enviro 1 2)
#user.Enviro{:cells 1, :dims 2}
无论如何,这样做会更加笨拙。

Recort类型是定义命名类型以与期望这种情况的Java库交互的快速方法。对于现场访问,它们的速度也比地图快一些。使用记录时请记住,如果您在使用它们时conj将一些额外的字段放入其中,然后将其删除,它们将默默地停止记录并恢复为普通地图。一般情况下,当你知道你需要它们用于java互操作或者你已经非常仔细地基准测试的非常优化的代码时使用记录(我在实践中从未见过这个)。它们对文档也有一定的价值。

这是使用java互操作表单的->recordName函数而不是的示例。

user> (ns game-of-life.point)
nil
game-of-life.point> (defrecord Point [x y])
game_of_life.point.Point
game-of-life.point> (in-ns 'user)
#namespace[user]
user> (require '[game-of-life.point :as point])
nil
user> (point/->Point 1 2)
#game_of_life.point.Point{:x 1, :y 2}

因为java互操作表单生成通常名称空间创建之外的名称类,所以如果使用className.构造函数或使用显式调用new来创建记录对象,则需要导入该类。如果您使用自动创建的函数->className,则不需要使用import