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"]])