এই নিবন্ধ অনুসারে লিস্প কোডের নিম্নলিখিত লাইনটি স্ট্যান্ডার্ড আউটপুটে "হ্যালো ওয়ার্ল্ড" মুদ্রণ করে।
(format t "hello, world")
লিস্প, যা একটি সমজাতীয় ভাষা , কোডটিকে ডেটা হিসাবে এইভাবে আচরণ করতে পারে:
এখন ভাবুন যে আমরা নিম্নলিখিত ম্যাক্রোটি লিখেছি:
(defmacro backwards (expr) (reverse expr))
পিছনে ম্যাক্রোর নাম, যা একটি অভিব্যক্তি নেয় (তালিকা হিসাবে উপস্থাপিত), এবং এর বিপরীত হয়। এখানে আবারও "হ্যালো, বিশ্ব" ম্যাক্রো ব্যবহার করে:
(backwards ("hello, world" t format))
লিস্প সংকলক কোডটির এই লাইনটি দেখলে, এটি তালিকার প্রথম অণুতে (
backwards
) দেখায় এবং লক্ষ্য করে যে এটি একটি ম্যাক্রোর নাম রাখে। এটি অমূল্য তালিকা("hello, world" t format)
ম্যাক্রোতে পাস করে , যা তালিকাটিকে পুনরায় সাজায়(format t "hello, world")
। ফলাফলের তালিকাটি ম্যাক্রো এক্সপ্রেশনকে প্রতিস্থাপন করে এবং রান-টাইমে মূল্যায়ন করা হবে। লিস্প পরিবেশ দেখতে পাবে যে এটির প্রথম অণু (format
) একটি ফাংশন এবং এটি মূল্যায়ন করবে এবং এটিকে বাকি আর্গুমেন্টগুলি পাস করবে।
লিস্পে এই কাজটি করা সহজ (যদি আমি ভুল হই তবে আমাকে সংশোধন কর) কারণ কোডটি তালিকা হিসাবে প্রয়োগ করা হয় ( গুলি-এক্সপ্রেশন ?)।
এখন এই ওসিএএমএল (যা কোনও হোমিকোনিক ভাষা নয়) স্নিপেটটি দেখুন:
let print () =
let message = "Hello world" in
print_endline message
;;
কল্পনা করুন যে আপনি ওসিএএমএলে হোমোসোনসিটি যুক্ত করতে চান, যা লিস্পের তুলনায় অনেক বেশি জটিল বাক্য গঠন ব্যবহার করে। আপনি এটা কিভাবে করবেন? সমজাতীয়তা অর্জনের জন্য কি ভাষাটির বিশেষ একটি সহজ বাক্য গঠন করতে হবে?
সম্পাদনা : এই বিষয়টি থেকে আমি সমজাতীয়তা অর্জনের অন্য একটি উপায় খুঁজে পেয়েছি যা লিস্পের থেকে পৃথক: আইও ভাষায় বাস্তবায়িত একটি । এটি এই প্রশ্নের আংশিক উত্তর দিতে পারে।
এখানে, একটি সাধারণ ব্লক দিয়ে শুরু করা যাক:
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 ==> +
গরম পবিত্র ঠান্ডা ছাঁচ। আপনি কেবল ব্লক প্যারামের নামই পেতে পারবেন না। এবং শুধুমাত্র আপনি ব্লকের সম্পূর্ণ উত্স কোডের স্ট্রিং পেতে পারবেন না get আপনি কোডটি স্নিগ্ধ করতে পারেন এবং বার্তাগুলিকে ভিতরে প্রবেশ করতে পারেন। এবং সবচেয়ে আশ্চর্যজনক: এটি অত্যন্ত ভয়ঙ্কর সহজ এবং প্রাকৃতিক। আইওয়ের সন্ধানে সত্য। রুবির আয়নাতে এর কিছুই দেখতে পাচ্ছে না।
তবে, ওহে হোয়া, এখন, এই ডায়ালটি স্পর্শ করবেন না।
Io> plus message next setName("-") ==> -(b) Io> plus ==> method(a, b, a - b ) Io> plus call(2, 3) ==> -1