इस लेख के अनुसार लिस्प कोड की निम्न पंक्ति "हैलो वर्ल्ड" को मानक आउटपुट में प्रिंट करती है।
(format t "hello, world")
लिस्प, जो एक होमोसेक्सुअल भाषा है , इस तरह से डेटा के रूप में कोड का इलाज कर सकता है:
अब कल्पना करें कि हमने निम्नलिखित मैक्रो लिखा है:
(defmacro backwards (expr) (reverse expr))
बैकवर्ड मैक्रो का नाम है, जो एक अभिव्यक्ति लेता है (एक सूची के रूप में दर्शाया गया है), और इसे उलट देता है। यहाँ "हैलो, दुनिया" फिर से है, इस बार मैक्रो का उपयोग कर:
(backwards ("hello, world" t format))
जब लिस्प कंपाइलर कोड की उस लाइन को देखता है, तो यह सूची में पहले परमाणु (
backwards
) को देखता है, और नोटिस करता है कि यह एक मैक्रो का नाम देता है। यह("hello, world" t format)
मैक्रो को अनवील किए गए सूची को पास करता है , जो सूची को फिर से व्यवस्थित करता है(format t "hello, world")
। परिणामी सूची मैक्रो अभिव्यक्ति को बदल देती है, और यह वह है जो रन-टाइम पर मूल्यांकन किया जाएगा। लिस्प वातावरण देखेगा कि इसका पहला परमाणु (format
) एक फ़ंक्शन है, और इसका मूल्यांकन करें, इसे बाकी तर्कों को पारित करते हुए।
लिस्प में इस कार्य को प्राप्त करना आसान है (मुझे गलत होने पर सही करें) क्योंकि कोड को सूची ( एस-एक्सप्रेशंस ?) के रूप में लागू किया गया है ।
अब इस OCaml (जो एक होमोसेक्सुअल भाषा नहीं है) पर एक नज़र डालें:
let print () =
let message = "Hello world" in
print_endline message
;;
कल्पना करें कि आप OCaml में समरूपता जोड़ना चाहते हैं, जो लिस्प की तुलना में बहुत अधिक जटिल वाक्यविन्यास का उपयोग करता है। आप वह कैसे करेंगें? क्या भाषा को समरूपता प्राप्त करने के लिए विशेष रूप से आसान वाक्यविन्यास करना पड़ता है?
EDIT : इस विषय से मुझे होमोसेक्सुअलिटी को प्राप्त करने का एक और तरीका मिला जो लिस्प से अलग है: io भाषा में लागू किया गया । यह आंशिक रूप से इस प्रश्न का उत्तर दे सकता है।
यहाँ, चलो एक साधारण ब्लॉक से शुरू करते हैं:
Io> plus := block(a, b, a + b) ==> method(a, b, a + b ) Io> plus call(2, 3) ==> 5
ठीक है, इसलिए ब्लॉक काम करता है। प्लस ब्लॉक ने दो नंबर जोड़े।
अब इस छोटे से साथी पर कुछ आत्मनिरीक्षण करें।
Io> plus argumentNames ==> list("a", "b") Io> plus code ==> block(a, b, a +(b)) Io> plus message name ==> a Io> plus message next ==> +(b) Io> plus message next name ==> +
गर्म पवित्र ठंडा सांचा। न केवल आप ब्लॉक के नाम पा सकते हैं। और न केवल आप ब्लॉक के पूर्ण स्रोत कोड की एक स्ट्रिंग प्राप्त कर सकते हैं। आप कोड में चुपके और संदेशों को अंदर ले जा सकते हैं। और सभी का सबसे अद्भुत: यह भयानक आसान और प्राकृतिक है। आईओ की खोज के लिए सही है। रूबी के दर्पण में से कोई भी नहीं देख सकता है।
लेकिन, जो वाह, हे, अब उस डायल को मत छुओ।
Io> plus message next setName("-") ==> -(b) Io> plus ==> method(a, b, a - b ) Io> plus call(2, 3) ==> -1