Leiningen과 Clojure를 사용하고 있으며 Clojure가 네임 스페이스를 올바르게 가져 오는 것이 왜 어려운지 이해할 수 없습니다.올바르게 Clojure에서 사용자 정의 클래스를 가져 오는 방법
: 나는합니다 (lein
프로젝트의 SRC/디렉토리에) 다음을 입력 REPL에서
; namespace macro
(ns animals.core
(:require animals.animal)
(:use animals.animal)
(:import (animals.animal Dog))
(:import (animals.animal Human))
(:import (animals.animal Arthropod))
(:import (animals.animal Insect)))
; make-animals will create a vector of animal objects
(defn make-animals []
(conj []
(Dog. "Terrier" "Canis lupis familiaris")
(Human. "Human" "Homo sapiens")
(Arthropod. "Brown Recluse" "Loxosceles reclusa")
(Insect. "Fire Ant" "Solenopsis conjurata")))
; print-animals will print all the animal objects
(defn print-animals [animals]
(doseq [animal animals]
(println animal)))
; move-animals will call the move action on each animal
(defn move-animals [animals]
(doseq [animal animals]
(animals.animal/move animal)))
; entry to main program
(defn -main [& args]
(let [animals make-animals]
(do
(println "Welcome to Animals!")
(println "-------------------")
(print-animals animals))))
그런 다음이이 내가 내 core.clj
파일에있는 것입니다
다음과 같은 오류입니다
user> (require 'animals.core)
nil
user> (animals.core/-main)
ClassNotFoundException animals.core java.net.URLClassLoader$1.run (URLClassLoader.java:202)
오케이 ... 뭐라 구요? 왜? 나는 때문에 -main
의 오타에 다른 오류가 신선한 Leiningen 프로젝트에 붙여 넣기 코드와
(ns animals.animal)
(defprotocol Animal
"A simple protocol for animal behaviors."
(move [this] "Method to move."))
(defrecord Dog [name species]
Animal
(move [this] (str "The " (:name this) " walks on all fours.")))
(defrecord Human [name species]
Animal
(move [this] (str "The " (:name this) " walks on two legs.")))
(defrecord Arthropod [name species]
Animal
(move [this] (str "The " (:name this) " walks on eight legs.")))
(defrecord Insect [name species]
Animal
(move [this] (str "The " (:name this) " walks on six legs.")))
이미 네임 스페이스가 필요한 경우 클래스를 가져올 필요가 없습니다. 각 레코드에는 접두사가 a 인 레코드 이름 인 2 개의 추가 함수가 정의되어 있습니다. '-> Record'는 생성자와 같이 동작하지만 함수입니다. 'map-> Record'는 속성 맵을 취합니다. 예를 들어,'(animals.core/-> Dog "Terrier" "Canis lupis familiaris")'를 사용할 수있게 해줄 것이며 Clojure 구현에서 코드를 더 이식성있게 만들 것이다. – deterb