Clojure - Cú pháp cơ bản
Để hiểu cú pháp cơ bản của Clojure, trước tiên chúng ta hãy xem một chương trình Hello World đơn giản.
Hello World như một chương trình hoàn chỉnh
Viết 'Xin chào thế giới' trong một chương trình Clojure hoàn chỉnh. Sau đây là một ví dụ.
Thí dụ
(ns clojure.examples.hello
(:gen-class))
(defn hello-world []
(println "Hello World"))
(hello-world)
Những điều sau đây cần được lưu ý về chương trình trên.
Chương trình sẽ được viết trong một tệp có tên là main.clj. Phần mở rộng 'clj' là tên phần mở rộng của tệp mã clojure. Trong ví dụ trên, tên của tệp được gọi là main.clj.
Từ khóa 'defn' được sử dụng để xác định một hàm. Chúng ta sẽ xem các chức năng chi tiết trong chương khác. Nhưng hiện tại, hãy biết rằng chúng ta đang tạo một hàm có tên là helloworld, hàm này sẽ có mã Clojure chính của chúng ta.
Trong mã Clojure của chúng tôi, chúng tôi đang sử dụng câu lệnh 'println' để in “Hello World” ra đầu ra của bảng điều khiển.
Sau đó, chúng tôi gọi hàm hello-world để chạy câu lệnh 'println'.
Chương trình trên tạo ra kết quả sau.
Đầu ra
Hello World
Hình thức chung của một tuyên bố
Dạng tổng quát của bất kỳ câu lệnh nào cần được đánh giá trong dấu ngoặc nhọn như trong ví dụ sau.
(+ 1 2)
Trong ví dụ trên, toàn bộ biểu thức được đặt trong dấu ngoặc nhọn. Đầu ra của câu lệnh trên là 3. Toán tử + hoạt động giống như một hàm trong Clojure, được sử dụng để cộng các chữ số. Giá trị của 1 và 2 được gọi là parameters to the function.
Chúng ta hãy xem xét một ví dụ khác. Trong ví dụ này, 'str' là toán tử được sử dụng để nối hai chuỗi. Các chuỗi “Xin chào” và “Thế giới” được sử dụng làm tham số.
(str "Hello" "World")
Thí dụ
Nếu chúng ta kết hợp hai câu lệnh trên và viết một chương trình, nó sẽ giống như sau.
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
Đầu ra
Chương trình trên tạo ra kết quả sau.
Hello World
3
Không gian tên
Không gian tên được sử dụng để xác định ranh giới logic giữa các mô-đun được xác định trong Clojure.
Không gian tên hiện tại
Điều này xác định không gian tên hiện tại chứa mã Clojure hiện tại.
Cú pháp
*ns*
Thí dụ
Trong cửa sổ lệnh REPL, hãy chạy lệnh sau.
*ns*
Đầu ra
Khi chúng tôi chạy lệnh trên, đầu ra sẽ trì hoãn tùy thuộc vào không gian tên hiện tại là gì. Sau đây là một ví dụ về đầu ra. Không gian tên của mã Clojure là -
clojure.examples.hello
(ns clojure.examples.hello
(:gen-class))
(defn Example []
(println (str "Hello World"))
(println (+ 1 2)))
(Example)
Yêu cầu Tuyên bố trong Clojure
Mã Clojure được đóng gói trong các thư viện. Mỗi thư viện Clojure thuộc về một không gian tên, tương tự như một gói Java. Bạn có thể tải thư viện Clojure với câu lệnh 'Yêu cầu'.
Cú pháp
(require quoted-namespace-symbol)
Thí dụ
Sau đây là một ví dụ về cách sử dụng câu lệnh này.
(ns clojure.examples.hello
(:gen-class))
(require ‘clojure.java.io’)
(defn Example []
(.exists (file "Example.txt")))
(Example)
Trong đoạn mã trên, chúng tôi đang sử dụng từ khóa 'request' để nhập không gian tên clojure.java.io có tất cả các chức năng cần thiết cho chức năng nhập / xuất. Vì chúng tôi không có thư viện bắt buộc, chúng tôi có thể sử dụng hàm 'tệp' trong đoạn mã trên.
Nhận xét trong Clojure
Nhận xét được sử dụng để ghi lại mã của bạn. Nhận xét dòng đơn được xác định bằng cách sử dụng dấu ;; ở bất kỳ vị trí nào trong dòng. Sau đây là một ví dụ.
Thí dụ
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println "Hello World"))
(Example)
Dấu phân cách
Trong Clojure, các câu lệnh có thể được tách hoặc phân tách bằng cách sử dụng dấu ngoặc nhọn cong hoặc vuông.
Thí dụ
Sau đây là hai ví dụ.
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println (+ 1 2 3)))
(Example)
Đầu ra
Chương trình trên tạo ra kết quả sau.
6
Thí dụ
Sau đây là một ví dụ khác.
(ns clojure.examples.hello
(:gen-class))
;; This program displays Hello World
(defn Example []
(println [+ 1 2 3]))
(Example)
Đầu ra
Chương trình trên tạo ra kết quả sau.
[#object[clojure.core$_PLUS_ 0x10f163b "clojure.core$_PLUS_@10f163b"] 1 2 3]
Khoảng trắng
Khoảng trắng có thể được sử dụng trong Clojure để phân chia các thành phần khác nhau của một câu lệnh cho rõ ràng hơn. Điều này có thể được thực hiện với sự hỗ trợ của toán tử dấu phẩy (,).
Ví dụ, hai câu lệnh sau là tương đương và đầu ra của cả hai câu lệnh sẽ là 15.
(+ 1 2 3 4 5)
(+ 1, 2, 3, 4, 5)
Mặc dù Clojure bỏ qua dấu phẩy, nhưng đôi khi nó sử dụng chúng để giúp lập trình viên đọc mọi thứ dễ dàng hơn.
Ví dụ: nếu bạn có một bản đồ băm như sau (def a-map {: a 1: b 2: c 3}) và yêu cầu giá trị của nó trong cửa sổ REPL, Clojure sẽ in đầu ra là {: a 1, : b 2,: c 3}.
Kết quả dễ đọc hơn, đặc biệt nếu bạn đang xem một lượng lớn dữ liệu.
Ký hiệu
Trong Clojure, các ký hiệu tương đương với các mã định danh trong các ngôn ngữ lập trình khác. Nhưng không giống như các ngôn ngữ lập trình khác, trình biên dịch coi các ký hiệu là các giá trị chuỗi thực tế. Vì một biểu tượng là một giá trị, một biểu tượng có thể được lưu trữ trong một bộ sưu tập, được truyền như một đối số cho một hàm, v.v., giống như bất kỳ đối tượng nào khác.
Một biểu tượng chỉ có thể chứa các ký tự chữ và số và '* +! /. : - _? ' nhưng không được bắt đầu bằng chữ số hoặc dấu hai chấm.
Sau đây là các ví dụ hợp lệ về các ký hiệu.
tutorial-point!
TUTORIAL
+tutorial+
Cấu trúc dự án Clojure
Cuối cùng, hãy nói về một cấu trúc dự án điển hình cho một dự án Clojure. Vì mã Clojure chạy trên máy ảo Java, nên hầu hết cấu trúc dự án trong Clojure tương tự như những gì bạn tìm thấy trong một dự án java. Sau đây là ảnh chụp nhanh cấu trúc dự án mẫu trong Eclipse cho một dự án Clojure.
Những điều chính sau đây cần được lưu ý về cấu trúc chương trình trên.
demo_1 - Đây là gói chứa tệp mã Clojure.
core.clj - Đây là tệp mã Clojure chính, sẽ chứa mã cho ứng dụng Clojure.
Thư mục Leiningen chứa các tệp như clojure-1.6.0.jar được yêu cầu để chạy bất kỳ ứng dụng dựa trên Clojure nào.
Tệp pom.properties sẽ chứa các thông tin như groupId, tạo tác và phiên bản của dự án Clojure.
Tệp project.clj chứa thông tin về chính ứng dụng Clojure. Sau đây là mẫu nội dung tệp dự án.
(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"]])