เป็นไปได้ไหมที่จะแบ่งเนมสเปซ Clojure บนไฟล์ต้นฉบับหลายไฟล์เมื่อทำการคอมไพล์ล่วงหน้าด้วย:gen-class
? ทำอย่างไร(:main true)
และ(defn- ...)
เข้ามามีบทบาทอย่างไร?
เป็นไปได้ไหมที่จะแบ่งเนมสเปซ Clojure บนไฟล์ต้นฉบับหลายไฟล์เมื่อทำการคอมไพล์ล่วงหน้าด้วย:gen-class
? ทำอย่างไร(:main true)
และ(defn- ...)
เข้ามามีบทบาทอย่างไร?
คำตอบ:
แน่นอนคุณสามารถในความเป็นจริงclojure.core
namespace ตัวเองจะถูกแยกออกมาด้วยวิธีนี้และให้เป็นแบบอย่างที่ดีที่คุณสามารถปฏิบัติตามโดยการค้นหาในsrc/clj/clojure
:
core.clj
core_deftype.clj
core_print.clj
core_proxy.clj
..etc..
ไฟล์ทั้งหมดเหล่านี้มีส่วนร่วมในการสร้างclojure.core
เนมสเปซเดียว
หนึ่งในนั้นคือไฟล์หลักซึ่งตั้งชื่อให้ตรงกับชื่อเนมสเปซเพื่อที่จะพบเมื่อมีคนพูดถึงไฟล์นั้นใน:use
หรือ:require
. ในกรณีนี้ไฟล์หลักคือclojure/core.clj
และเริ่มต้นด้วยns
แบบฟอร์ม นี่คือที่ที่คุณควรกำหนดค่าเนมสเปซทั้งหมดของคุณไม่ว่าไฟล์อื่น ๆ ของคุณจะต้องการไฟล์ใด ซึ่งโดยปกติจะรวมถึง:gen-class
เช่นกันดังนั้นสิ่งที่ต้องการ:
(ns my.lib.of.excellence
(:use [clojure.java.io :as io :only [reader]])
(:gen-class :main true))
จากนั้นในตำแหน่งที่เหมาะสมในไฟล์หลักของคุณ (โดยทั่วไปจะอยู่ท้ายสุด) load
เพื่อนำไฟล์ตัวช่วยของคุณเข้ามา ในclojure.core
ลักษณะนี้:
(load "core_proxy")
(load "core_print")
(load "genclass")
(load "core_deftype")
(load "core/protocols")
(load "gvec")
โปรดทราบว่าคุณไม่จำเป็นต้องใช้ไดเร็กทอรีปัจจุบันเป็นคำนำหน้าและไม่ต้องการ.clj
คำต่อท้าย
ไฟล์ตัวช่วยแต่ละไฟล์ควรเริ่มต้นด้วยการประกาศว่ากำลังช่วยเนมสเปซใด แต่ควรทำโดยใช้in-ns
ฟังก์ชัน ดังนั้นสำหรับตัวอย่างเนมสเปซด้านบนไฟล์ตัวช่วยทั้งหมดจะขึ้นต้นด้วย:
(in-ns 'my.lib.of.excellence)
นั่นคือทั้งหมดที่ต้องใช้
เนื่องจากไฟล์เหล่านี้ทั้งหมดสร้างเนมสเปซเดียวแต่ละฟังก์ชันที่คุณกำหนดอาจอยู่ในไฟล์หลักหรือไฟล์ตัวช่วยใดก็ได้ แน่นอนว่าคุณสามารถกำหนดgen-class
ฟังก์ชันของคุณในไฟล์ใดก็ได้ที่คุณต้องการ:
(defn -main [& args]
...)
โปรดทราบว่ากฎคำสั่งนิยามตามปกติของ Clojure ยังคงใช้กับฟังก์ชันทั้งหมดดังนั้นคุณต้องตรวจสอบให้แน่ใจว่าไฟล์ใดก็ตามที่กำหนดฟังก์ชันจะถูกโหลดก่อนที่คุณจะพยายามใช้ฟังก์ชันนั้น
คุณยังถามเกี่ยวกับ(defn- foo ...)
แบบฟอร์มที่กำหนดฟังก์ชันเนมสเปซส่วนตัว ฟังก์ชันที่กำหนดเช่นนี้และ:private
ตัวแปรอื่น ๆสามารถมองเห็นได้จากภายในเนมสเปซที่กำหนดไว้ดังนั้นไฟล์หลักและไฟล์ตัวช่วยทั้งหมดจะสามารถเข้าถึงตัวแปรส่วนตัวที่กำหนดไว้ในไฟล์ใด ๆ ที่โหลดจนถึงตอนนี้