Clojure - ไวยากรณ์พื้นฐาน
เพื่อให้เข้าใจไวยากรณ์พื้นฐานของ Clojure เรามาดูโปรแกรม Hello World แบบง่ายๆกันก่อน
Hello World เป็นโปรแกรมที่สมบูรณ์
เขียน 'Hello world' ในโปรแกรม Clojure ที่สมบูรณ์ ต่อไปนี้เป็นตัวอย่าง
ตัวอย่าง
(ns clojure.examples.hello
(:gen-class))
(defn hello-world []
(println "Hello World"))
(hello-world)
สิ่งต่อไปนี้ต้องสังเกตเกี่ยวกับโปรแกรมข้างต้น
โปรแกรมจะเขียนในไฟล์ชื่อ main.clj นามสกุล 'clj' เป็นชื่อส่วนขยายของไฟล์รหัส clojure ในตัวอย่างข้างต้นชื่อของไฟล์เรียกว่า main.clj
คำหลัก 'defn' ใช้เพื่อกำหนดฟังก์ชัน เราจะเห็นฟังก์ชั่นโดยละเอียดในอีกบทหนึ่ง แต่สำหรับตอนนี้โปรดทราบว่าเรากำลังสร้างฟังก์ชันที่เรียกว่า helloworld ซึ่งจะมีรหัส Clojure หลักของเรา
ในรหัส Clojure ของเราเราใช้คำสั่ง 'println' เพื่อพิมพ์“ Hello World” ไปยังเอาต์พุตคอนโซล
จากนั้นเราจะเรียกใช้ฟังก์ชัน hello-world ซึ่งจะเรียกใช้คำสั่ง 'println'
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้
เอาต์พุต
Hello World
รูปแบบทั่วไปของคำชี้แจง
รูปแบบทั่วไปของคำสั่งใด ๆ จำเป็นต้องได้รับการประเมินในวงเล็บปีกกาดังที่แสดงในตัวอย่างต่อไปนี้
(+ 1 2)
ในตัวอย่างข้างต้นนิพจน์ทั้งหมดอยู่ในวงเล็บปีกกา ผลลัพธ์ของข้อความข้างต้นคือ 3 ตัวดำเนินการ + ทำหน้าที่เหมือนฟังก์ชันใน Clojure ซึ่งใช้สำหรับการบวกตัวเลข ค่าของ 1 และ 2 เรียกว่า parameters to the function.
ขอให้เราพิจารณาอีกตัวอย่างหนึ่ง ในตัวอย่างนี้ 'str' คือตัวดำเนินการที่ใช้เพื่อเชื่อมสองสตริงเข้าด้วยกัน สตริง“ Hello” และ“ World” ใช้เป็นพารามิเตอร์
(str "Hello" "World")
ตัวอย่าง
หากเรารวมสองคำสั่งข้างต้นและเขียนโปรแกรมจะมีลักษณะดังต่อไปนี้
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
เอาต์พุต
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้
Hello World
3
เนมสเปซ
เนมสเปซใช้เพื่อกำหนดขอบเขตตรรกะระหว่างโมดูลที่กำหนดใน Clojure
เนมสเปซปัจจุบัน
สิ่งนี้กำหนดเนมสเปซปัจจุบันที่มีรหัส Clojure ปัจจุบันอยู่
ไวยากรณ์
*ns*
ตัวอย่าง
ในหน้าต่างคำสั่ง REPL ให้รันคำสั่งต่อไปนี้
*ns*
เอาต์พุต
เมื่อเรารันคำสั่งด้านบนผลลัพธ์จะเลื่อนออกไปขึ้นอยู่กับเนมสเปซปัจจุบันคืออะไร ต่อไปนี้เป็นตัวอย่างของผลลัพธ์ เนมสเปซของรหัส Clojure คือ -
clojure.examples.hello
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
ต้องการคำชี้แจงใน Clojure
รหัส Clojure บรรจุในไลบรารี ไลบรารี Clojure แต่ละไลบรารีเป็นของเนมสเปซซึ่งคล้ายคลึงกับแพ็คเกจ Java คุณสามารถโหลดไลบรารี Clojure ด้วยคำสั่ง 'Require'
ไวยากรณ์
(require quoted-namespace-symbol)
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างของการใช้คำสั่งนี้
(ns clojure.examples.hello
(:gen-class))
(require ‘clojure.java.io’)
(defn Example []
(.exists (file "Example.txt")))
(Example)
ในโค้ดด้านบนเราใช้คีย์เวิร์ด 'require' เพื่อนำเข้าเนมสเปซ clojure.java.io ซึ่งมีฟังก์ชันทั้งหมดที่จำเป็นสำหรับฟังก์ชันอินพุต / เอาต์พุต เนื่องจากเราไม่มีไลบรารีที่ต้องการเราจึงสามารถใช้ฟังก์ชัน 'file' ในโค้ดด้านบนได้
ความคิดเห็นใน Clojure
ข้อคิดเห็นใช้ในการจัดทำเอกสารรหัสของคุณ ความคิดเห็นบรรทัดเดียวถูกระบุโดยใช้ ;; ที่ตำแหน่งใดก็ได้ในบรรทัด ต่อไปนี้เป็นตัวอย่าง
ตัวอย่าง
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println "Hello World"))
(Example)
ตัวคั่น
ใน Clojure ข้อความสามารถแบ่งหรือคั่นได้โดยใช้วงเล็บปีกกาแบบโค้งหรือแบบเหลี่ยม
ตัวอย่าง
ต่อไปนี้เป็นสองตัวอย่าง
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println (+ 1 2 3)))
(Example)
เอาต์พุต
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้
6
ตัวอย่าง
ต่อไปนี้เป็นอีกตัวอย่างหนึ่ง
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println [+ 1 2 3]))
(Example)
เอาต์พุต
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้
[#object[clojure.core$_PLUS_ 0x10f163b "clojure.core$_PLUS_@10f163b"] 1 2 3]
ช่องว่าง
สามารถใช้ช่องว่างใน Clojure เพื่อแยกส่วนประกอบต่างๆของคำสั่งเพื่อความชัดเจนที่ดีขึ้น ซึ่งสามารถทำได้ด้วยความช่วยเหลือของตัวดำเนินการลูกน้ำ (,)
ตัวอย่างเช่นสองคำสั่งต่อไปนี้เทียบเท่ากันและผลลัพธ์ของทั้งสองคำสั่งจะเป็น 15
(+ 1 2 3 4 5)
(+ 1, 2, 3, 4, 5)
แม้ว่า Clojure จะละเว้นเครื่องหมายจุลภาค แต่บางครั้งก็ใช้เพื่อทำให้โปรแกรมเมอร์อ่านสิ่งต่างๆได้ง่ายขึ้น
ตัวอย่างเช่นหากคุณมีแผนที่แฮชดังต่อไปนี้ (def a-map {: a 1: b 2: c 3}) และถามค่าของมันในหน้าต่าง REPL Clojure จะพิมพ์ผลลัพธ์เป็น {: a 1, : b 2,: c 3}
ผลลัพธ์จะอ่านได้ง่ายขึ้นโดยเฉพาะอย่างยิ่งหากคุณกำลังดูข้อมูลจำนวนมาก
สัญลักษณ์
ใน Clojure สัญลักษณ์จะเทียบเท่ากับตัวระบุในภาษาโปรแกรมอื่น ๆ แต่แตกต่างจากภาษาโปรแกรมอื่น ๆ คอมไพเลอร์มองว่าสัญลักษณ์เป็นค่าสตริงจริง เนื่องจากสัญลักษณ์เป็นค่าสัญลักษณ์สามารถเก็บไว้ในคอลเลกชั่นส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชัน ฯลฯ เช่นเดียวกับวัตถุอื่น ๆ
สัญลักษณ์สามารถมีได้เฉพาะอักขระที่เป็นตัวเลขและตัวอักษรและ '* +! /. : - _? ' แต่ต้องไม่ขึ้นต้นด้วยตัวเลขหรือลำไส้ใหญ่
ต่อไปนี้เป็นตัวอย่างสัญลักษณ์ที่ถูกต้อง
tutorial-point!
TUTORIAL
+tutorial+
โครงสร้างโครงการ Clojure
สุดท้ายเรามาพูดถึงโครงสร้างโครงการทั่วไปสำหรับโครงการ Clojure เนื่องจากโค้ด Clojure ทำงานบนเครื่องเสมือน Java โครงสร้างโครงการส่วนใหญ่ภายใน Clojure จึงคล้ายกับที่คุณจะพบในโปรเจ็กต์ java ต่อไปนี้เป็นภาพรวมของโครงสร้างโครงการตัวอย่างใน Eclipse สำหรับโครงการ Clojure
สิ่งสำคัญต่อไปนี้ต้องสังเกตเกี่ยวกับโครงสร้างโปรแกรมข้างต้น
demo_1 - นี่คือแพ็คเกจที่ใส่ไฟล์รหัส Clojure
core.clj - นี่คือไฟล์รหัส Clojure หลักซึ่งจะมีรหัสสำหรับแอปพลิเคชัน Clojure
โฟลเดอร์ Leiningen มีไฟล์เช่น clojure-1.6.0.jar ซึ่งจำเป็นสำหรับการเรียกใช้แอปพลิเคชันที่ใช้ Clojure
ไฟล์ pom.properties จะมีข้อมูลเช่น groupId, artifactId และเวอร์ชันของโปรเจ็กต์ Clojure
ไฟล์ project.clj มีข้อมูลเกี่ยวกับแอปพลิเคชัน Clojure เอง ต่อไปนี้เป็นตัวอย่างเนื้อหาของไฟล์โครงการ
(defproject demo-1 "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:license {
:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"
}
:dependencies [[org.clojure/clojure "1.6.0"]])