2012-05-30 32 views
16

Tôi đang có một thời gian khó hiểu (và do đó nhớ) clojure yêu cầu cú pháp được mô tả ở đây: http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require. Dường như cả hai truy cập trực quan và không thống nhất.clojure yêu cầu lý do cú pháp

Ví dụ, trong những sản phẩm sau tại sao vector này yêu cầu phải được trích dẫn:

(require '[clj-json.core :as json]) 

Counter trực quan vì thông thường vectơ không được niêm yết trong clojure (danh sách được trích dẫn và vectơ được coi là dữ liệu).

Và không đồng nhất bởi vì trong trường hợp này các vector là không trích dẫn:

(ns xxx 
    (:require [clj-json.core :as json])) 

Tôi nhận ra rằng các yêu cầu chức năng và :require sử dụng bên trong ns vĩ mô chỉ có quang học tương tự, nhưng vẫn còn.

Có phần khác của weirdness là tốt, ví dụ như tôi có thể làm điều này:

(require '(clj-json.core)) 

Nhưng tôi không thể làm điều này:

(require '(clj-json.core :as json)) 

Ai đó có thể trả lời những câu hỏi sau:

  1. trong ví dụ đầu tiên tại sao vector cần phải được trích dẫn?
  2. tại sao không cần phải được trích dẫn trong macro ns?
  3. tại sao ký hiệu danh sách không cho phép :as?

Tôi tự hỏi nếu có lý do tại sao mọi thứ là như thế nào, hoặc nếu sự mâu thuẫn không được chú ý tại thời điểm thiết kế.

+0

Check-out [chủ đề này] (https://groups.google.com/forum/?fromgroups#!searchin/clojure-dev/ns$20macro/clojure-dev/6EEfdPhrWgk/qJALczHTzpkJ) trên clojure -dev danh sách nếu bạn chưa nhìn thấy nó. Tôi tìm thấy nó khá nhiều thông tin. – Jeremy

Trả lời

11
  1. trong ví dụ đầu tiên tại sao vector cần phải được trích dẫn?

require là một chức năng, vì vậy bạn phải báo giá chúng để tránh đánh giá. Nếu không, các biểu tượng đó sẽ được tra cứu trong ngữ cảnh hiện tại, có thể dẫn đến lỗi hoặc có thể là hành vi không mong muốn. Nhân tiện, tôi nghĩ điều này không hoàn toàn đúng: "Truy cập trực quan vì các vectơ thông thường không được trích dẫn trong clojure (danh sách được trích dẫn và vectơ được coi là dữ liệu)."

Nó có thể phản đối trực quan với bạn, tuy nhiên không có gì sai khi trích dẫn vectơ (hoặc bản đồ hoặc tập hợp). Tôi thường làm gì khi nhanh chóng thử nghiệm một cái gì đó ở REPL, và không muốn gõ một : cho mỗi từ khóa trong một bản đồ hoặc vector, ví dụ:

user=> '{a 1 b 2 c 3} 

hơn:

user=> {:a 1 :b 2 :c 3} 

Các đầu tiên là rất nhanh hơn để gõ nếu tôi chỉ muốn nhanh chóng có được một số dữ liệu để kiểm tra một cái gì đó với.

  1. tại sao không cần phải được trích dẫn trong macro ns?

Macros không đánh giá lập luận của họ, họ là loại lazier hơn chức năng cuộc gọi bình thường, vì vậy những biểu tượng (clj-json.corejson) không cần phải được trích dẫn để ngăn chặn đánh giá.

  1. tại sao ký hiệu danh sách không cho phép: như?

Xin lỗi, tôi không biết câu trả lời cho câu hỏi này.

Ah, tôi đã xem tài liệu cho require và phát hiện ra. Có một biểu mẫu khác được hỗ trợ:

"Sau đây sẽ tải thư viện clojure.zip và clojure.set viết tắt là 's'."

(require '(clojure zip [set :as s])) 
+3

ok vì vậy tôi vừa nhận ra (sau lời giải thích của bạn) rằng '(yêu cầu ['clj-json.core: as' json])' hoạt động (vector không được trích dẫn) nhưng yêu cầu trích dẫn hai lần thay vì một lần (có thể là lý do tại sao vector được ưu tiên) . Thế giới chỉ cần có ý nghĩa và sau đó tôi có thể chấp nhận nó. – Kevin

+0

Đúng, tôi đã thực sự sắp sửa chỉnh sửa hoặc nhận xét với ví dụ đó để nghĩ rằng nó có thể hữu ích. Có cái gì đó vẫn không có ý nghĩa? – spacemanaki

+0

với ví dụ cuối cùng tại sao không cho phép '(yêu cầu '(clj-json.core: as json))'? Tôi đoán rằng cho phép điều đó sẽ làm cho một số hình thức chấp nhận khác mơ hồ hoặc một cái gì đó ... – Kevin

Các vấn đề liên quan