এমন অনেকগুলি ভাষা রয়েছে যা একরকম ধাতব প্রোগ্রামের অনুমতি দেয় । বিশেষত ভাষাগুলির লিসপ পরিবার সম্পর্কে কোন উত্তর দেওয়ার কথা শুনে আমি অবাক হয়েছি ।
উইকিপিডিয়া থেকে:
প্রোগ্রামগুলি তাদের ডেটা হিসাবে গণ্য করার দক্ষতার সাথে কম্পিউটার প্রোগ্রামগুলি রচনাকে মেটাপোগ্র্যামিং ming
পরে লেখায়:
লিস্প সম্ভবত apতিহাসিক নজির এবং এর রূপকল্পের সরলতা এবং শক্তির কারণে উভয়ই রূপক সুবিধার সাথে পঞ্চম ভাষা language
লিস্প ভাষা
লিস্পে একটি দ্রুত তৈরির পরিচয় অনুসরণ করা হচ্ছে।
কোড দেখার একটি উপায় হ'ল নির্দেশের স্যুট হিসাবে: এটি করুন, তারপরে এটি করুন, তারপরে এই অন্য জিনিসটি করুন ... এটি একটি তালিকা! প্রোগ্রামটি করার জন্য জিনিসগুলির একটি তালিকা। এবং অবশ্যই আপনার লুপগুলি উপস্থাপনের জন্য তালিকার ভিতরে তালিকা থাকতে পারে ..
আমরা যদি ভালো একটি, বি, সি, ডি উপাদান সম্বলিত একটি তালিকা প্রতিনিধিত্ব: (ABCD) আমরা কিছু পেতে একটি পাতার মর্মর ফাংশন কল, যেখানে মত দেখাচ্ছে a
ফাংশন, এবং b
, c
, d
আর্গুমেন্ট। আসলে যদি টিপিক্যাল হয় "হ্যালো ওয়ার্ল্ড!" প্রোগ্রাম যেমন লেখা যেতে পারে:(println "Hello World!")
অবশ্যই b
, c
বা d
তালিকাগুলি হতে পারে যা কিছুতে মূল্যায়নও করে। নিম্নলিখিত: এর (println "I can add :" (+ 1 3) )
পরে "" আমি যুক্ত করতে পারি: 4 "মুদ্রণ করবে।
সুতরাং, একটি প্রোগ্রাম নেস্টেড তালিকার একটি সিরিজ এবং প্রথম উপাদানটি একটি ফাংশন। সুসংবাদটি হ'ল আমরা তালিকাগুলি পরিচালনা করতে পারি! সুতরাং আমরা প্রোগ্রামিং ভাষাগুলিতে কারসাজি করতে পারি।
লিস্প সুবিধা
লিসপগুলি তেমন প্রোগ্রামিং ভাষা নয় যতটা প্রোগ্রামিং ভাষা তৈরির জন্য একটি সরঞ্জামকিট। একটি প্রোগ্রামেবল প্রোগ্রামিং ভাষা।
নতুন অপারেটরগুলি তৈরি করা লিসপ্সগুলিতে এটি কেবল খুব সহজ নয়, অন্য ভাষায় কিছু অপারেটর লেখা প্রায় অসম্ভব কারণ কারণ ফাংশনে যাওয়ার সময় যুক্তিগুলি মূল্যায়ন করা হয়।
উদাহরণস্বরূপ সি-এর মতো ভাষায় বলা যাক যে আপনি if
নিজে একজন অপারেটর লিখতে চান , এরকম কিছু:
my-if(condition, if-true, if-false)
my-if(false, print("I should not be printed"), print("I should be printed"))
এক্ষেত্রে উভয় যুক্তিই আর্গুমেন্টগুলির মূল্যায়নের ক্রমের উপর নির্ভর করে একটি আদেশে মূল্যায়ন ও মুদ্রণ করা হবে।
লিসপ্সে, অপারেটর লেখার (আমরা এটিকে ম্যাক্রো বলি) এবং একটি ফাংশন লেখার বিষয়টি একই জিনিস এবং একইভাবে ব্যবহৃত হয়। ম্যাক্রোর প্যারামিটারগুলি ম্যাক্রোর আর্গুমেন্ট হিসাবে পাস করার আগে মূল্যায়ন করা হয় না তার মধ্যে প্রধান পার্থক্য । if
উপরের মতো কিছু অপারেটর লিখতে সক্ষম হওয়া এটি প্রয়োজনীয় ।
বাস্তব-বিশ্বের ভাষাগুলি
এখানে ঠিক কীভাবে সুযোগের বাইরে রয়েছে তা দেখানো হচ্ছে, তবে আমি আপনাকে আরও শিখতে একটি লিস্পে প্রোগ্রামিংয়ের চেষ্টা করতে উত্সাহিত করি। উদাহরণস্বরূপ আপনি এ একবার দেখতে পারেন:
- স্কিম , একটি ছোট কোর সহ একটি পুরানো, বেশ "খাঁটি" লিস্প
- কমন লিস্প, একটি ভাল সংহত বস্তু সিস্টেম সহ একটি বৃহত লিস্প এবং অনেকগুলি বাস্তবায়ন (এটি এএনএসআই-স্ট্যান্ডার্ডাইজড)
- একটি টাইপ করা লিপ র্যাকেট
- আমার প্রিয় ক্লোজার , উপরের উদাহরণগুলি ক্লোজার কোড ছিল। জেভিএম-তে চলছে একটি আধুনিক লিস্প। সেখানে Clojure ম্যাক্রো কিছু উদাহরণ তাই পাশাপাশি (কিন্তু এই অধিকার জায়গা থেকে শুরু নয়। আমি দেখাবে 4clojure , braveclojure বা clojure koans প্রথম))।
ওহ এবং যাইহোক, লিস্পের অর্থ LISt প্রক্রিয়াজাতকরণ।
আপনার উদাহরণ সম্পর্কে
আমি নীচের ক্লোজার ব্যবহার করে উদাহরণ দিতে যাচ্ছি:
আপনি যদি add
ক্লোজুরে একটি ফাংশন লিখতে পারেন তবে আপনি (defn add [a b] ...your-implementation-here... )
এটির +
মতো নাম লিখতে পারেন (defn + [a b] ...your-implementation-here... )
। এটি প্রকৃত বাস্তবায়নে যা করা হয় তা হ'ল (ফাংশনটির মূল অংশটি আরও কিছুটা জড়িত তবে সংজ্ঞাটি মূলত আমি উপরে যেমন লিখেছি তেমন একই)।
ইনফিক্স স্বরলিপি সম্পর্কে কি? ওয়েল ক্লুজুরে একটি prefix
(বা পোলিশ) স্বরলিপি ব্যবহার করে, তাই আমরা এমন একটি infix-to-prefix
ম্যাক্রো তৈরি করতে পারি যা উপসর্গযুক্ত কোডটিকে ক্লোজার কোডে পরিণত করে। যা আসলে আশ্চর্যজনকভাবে সহজ (এটি আসলে ক্লোজার কোয়ানসের ম্যাক্রো অনুশীলনের মধ্যে একটি)! এটি বন্যগুলিতেও$=
দেখা যায়, উদাহরণস্বরূপ ইনকান্টার ম্যাক্রো দেখুন ।
এখানে কোয়ানদের সহজতম সংস্করণটি ব্যাখ্যা করা হয়েছে:
(defmacro infix [form]
(list (second form) (first form) (nth form 2)))
;; takes a form (ie. some code) as parameter
;; and returns a list (ie. some other code)
;; where the first element is the second element from the original form
;; and the second element is the first element from the original form
;; and the third element is the third element from the original form (indexes start at 0)
;; example :
;; (infix (9 + 1))
;; will become (+ 9 1) which is valid Clojure code and will be executed to give 10 as a result
বিন্দুটিকে আরও চালিত করতে কিছু লিস্প উদ্ধৃতি দেয় :
“লিস্পকে স্বতন্ত্র করে তোলে তার একটি অংশ এটি বিকশিত হওয়ার জন্য ডিজাইন করা হয়েছে। নতুন লিস্প অপারেটরগুলি সংজ্ঞায়িত করতে আপনি লিস্প ব্যবহার করতে পারেন। নতুন বিমূর্ততা জনপ্রিয় হওয়ার সাথে সাথে (উদাহরণস্বরূপ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং), এটি সর্বদা লিস্পে প্রয়োগ করা সহজ হয়ে যায়। ডিএনএ-র মতো এ জাতীয় ভাষাও স্টাইলের বাইরে যায় না। ”
- পল গ্রাহাম, এএনএসআই কমন লিস্প
“লিস্পে প্রোগ্রামিং করা মহাবিশ্বের আদিম বাহিনীর সাথে খেলার মতো। এটি আপনার আঙ্গুলের মাঝে বজ্রপাতের মতো অনুভূত হয়। অন্য কোনও ভাষা এমনকি কাছাকাছি বোধ করে না। "
- গ্লেন এহরিলিচ, রোড টু লিস্প