2012-05-30 11 views
16

की आवश्यकता है मुझे क्लोजर को यहां वर्णित वाक्यविन्यास की आवश्यकता है (http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require। यह काउंटर अंतर्ज्ञानी और गैर वर्दी दोनों लगता है।क्लोजर के लिए सिंटैक्स राशन

उदाहरण के लिए, के बाद इस सदिश आवश्यक क्यों उद्धृत किया जाना करने के लिए किया जाता है:

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

काउंटर सहज ज्ञान युक्त क्योंकि सामान्य रूप से वैक्टर clojure में उद्धृत नहीं कर रहे हैं (सूचियों उद्धृत कर रहे हैं और वैक्टर डेटा के रूप में माना जाता है)।

और असमान क्योंकि इस मामले में वेक्टर उद्धृत नहीं है:

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

मुझे लगता है कि समारोह की आवश्यकता होती है और एनएस मैक्रो में किसी एक :require उपयोग केवल ऑप्टिकली समान है, लेकिन अभी भी कर रहे हैं।

weirdness के अन्य टुकड़े के साथ-साथ, कर रहे हैं, उदाहरण के लिए मैं यह कर सकता:

(require '(clj-json.core)) 

लेकिन मैं ऐसा नहीं कर सकते:

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

कोई इन सवालों का जवाब कर सकते हैं:

  1. पहले उदाहरण में वेक्टर को उद्धृत करने की आवश्यकता क्यों है?
  2. एनएस मैक्रो में उद्धृत करने की आवश्यकता क्यों नहीं है?
  3. सूची नोटेशन :as क्यों अनुमति नहीं देता है?

मुझे आश्चर्य है कि क्या कारण हैं कि चीजें क्यों हैं, या अगर डिजाइन समय पर असंगतता पर ध्यान नहीं दिया गया था।

+0

चेक बाहर [इस सूत्र] (https://groups.google.com/forum/?fromgroups#!searchin/clojure-dev/ns$20macro/clojure-dev/6EEfdPhrWgk/qJALczHTzpkJ) clojure पर -dev सूची अगर आपने इसे पहले से नहीं देखा है। मैंने इसे काफी जानकारीपूर्ण पाया। – Jeremy

उत्तर

11
  1. पहले उदाहरण में वेक्टर को उद्धृत करने की आवश्यकता क्यों है?

require एक फ़ंक्शन है, इसलिए मूल्यांकन को रोकने के लिए आपको उन्हें उद्धृत करना होगा। अन्यथा उन प्रतीकों को वर्तमान संदर्भ में देखा जाएगा, जिसके परिणामस्वरूप एक त्रुटि या संभवतः अप्रत्याशित व्यवहार हो सकता है। वैसे, मुझे लगता है कि यह बिल्कुल सही नहीं है: "काउंटर अंतर्ज्ञानी क्योंकि आमतौर पर वैक्टर को क्लोजर में उद्धृत नहीं किया जाता है (सूचियों को उद्धृत किया जाता है और वैक्टर को डेटा के रूप में माना जाता है)।"

यह आपके लिए अंतर्ज्ञानी हो सकता है, हालांकि वैक्टर (या मानचित्र या सेट) उद्धृत करने में कुछ भी गलत नहीं है। मैं अक्सर जल्दी से आरईपीएल पर कुछ परीक्षण करते हैं, और एक नक्शा या वेक्टर में प्रत्येक कीवर्ड के लिए : टाइप करने के लिए नहीं करना चाहते हैं, उदाहरण के लिए:

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

बजाय:

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

सबसे पहले टाइप करने के लिए बहुत ही मामूली तेज़ है यदि मैं बस कुछ डेटा जांचने के लिए कुछ डेटा प्राप्त करना चाहता हूं।

  1. एनएस मैक्रो में इसे उद्धृत करने की आवश्यकता क्यों नहीं है?

मैक्रो उनके तर्कों का मूल्यांकन नहीं करते, वे सामान्य कार्य कॉल की तुलना में एक तरह से lazier हैं, तो प्रतीक (clj-json.core और json) की जरूरत नहीं है मूल्यांकन को रोकने के लिए उद्धृत किया जाना है।

  1. सूची नोटेशन क्यों अनुमति नहीं देता है: जैसा?

क्षमा करें, मुझे इसका उत्तर नहीं पता।

आह, मैंने require के लिए दस्तावेज़ों पर एक नज़र डाली और पता चला। एक और फॉर्म समर्थित है:

"निम्नलिखित पुस्तकालयों को clojure.zip और clojure.set को संक्षिप्त रूप से लोड किया जाएगा।"

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

ठीक है तो मुझे अभी एहसास हुआ है (आपकी व्याख्या के बाद) '(आवश्यकता [' clj-json.core: as 'json])' काम करता है (unquoted वेक्टर) लेकिन एक बार के बजाय दो बार उद्धरण की आवश्यकता है (संभवतः उद्धृत वेक्टर को क्यों पसंद किया जाता है) । दुनिया को सिर्फ समझने की जरूरत है और फिर मैं इसे स्वीकार कर सकता हूं। – Kevin

+0

हां, मैं वास्तव में उस उदाहरण के साथ संपादित या टिप्पणी करने वाला था, सोच रहा था कि इससे मदद मिल सकती है। क्या कुछ अभी भी समझ में नहीं आता है? पिछले उदाहरण के साथ – spacemanaki

+0

क्यों '(आवश्यकता' (clj-json.core: json के रूप में) की अनुमति नहीं है) '? मुझे लगता है कि इससे कुछ अन्य स्वीकृत फॉर्म अस्पष्ट या कुछ ... – Kevin

संबंधित मुद्दे