1) পরিবর্তনশীল একটি নতুন ধারণা। লিস্পে, সমস্ত ভেরিয়েবল কার্যকরভাবে পয়েন্টার হয়। মানগুলি হ'ল প্রকারগুলি রয়েছে, ভেরিয়েবলগুলি নয় এবং ভেরিয়েবলগুলি নির্ধারণ করা বা বাঁধাই করার অর্থ পয়েন্টারগুলি অনুলিপি করা হয়, তারা কী দেখায় তা নয়।
(defun print-twice (it)
(print it)
(print it))
'এটি' একটি পরিবর্তনশীল। এটি যে কোনও মানের সাথে আবদ্ধ হতে পারে। ভেরিয়েবলের সাথে কোনও সীমাবদ্ধতা এবং কোনও প্রকার যুক্ত নেই। আপনি যদি ফাংশনটি কল করেন তবে যুক্তিটি অনুলিপি করার দরকার নেই। ভেরিয়েবল পয়েন্টারের সমান। এটির ভ্যারিয়েবলের সাথে আবদ্ধ মানটি অ্যাক্সেস করার একটি উপায় রয়েছে। স্মৃতি সংরক্ষণ করার দরকার নেই । আমরা যখন ফাংশনটি কল করি তখন আমরা যে কোনও ডেটা অবজেক্টটি পাস করতে পারি: যে কোনও আকার এবং যেকোন প্রকার।
ডেটা অবজেক্টগুলির একটি 'টাইপ' থাকে এবং সমস্ত ডেটা অবজেক্টকে এর 'টাইপ' এর জন্য অনুসন্ধান করা যেতে পারে।
(type-of "abc") -> STRING
2) একটি প্রতীক প্রকার। চিহ্নগুলি স্ট্রিং থেকে পৃথক যে আপনি একটি পয়েন্টারের সাথে তুলনা করে সমতা পরীক্ষা করতে পারেন।
একটি চিহ্ন একটি নাম সহ একটি ডেটা অবজেক্ট। সাধারণত নামটি অবজেক্টটি সন্ধান করতে ব্যবহার করা যেতে পারে:
|This is a Symbol|
this-is-also-a-symbol
(find-symbol "SIN") -> SIN
যেহেতু প্রতীকগুলি হ'ল ডেটা অবজেক্ট, তাই আমরা সেগুলি একই জিনিস কিনা তা পরীক্ষা করতে পারি:
(eq 'sin 'cos) -> NIL
(eq 'sin 'sin) -> T
এটি আমাদের উদাহরণস্বরূপ চিহ্ন সহ একটি বাক্য লিখতে সহায়তা করে:
(defvar *sentence* '(mary called tom to tell him the price of the book))
বাক্যটিতে এখন আমরা সংখ্যাটি গণনা করতে পারি:
(count 'the *sentence*) -> 2
কমন লিস্পে চিহ্নগুলির মধ্যে কেবল একটি নামই থাকে না তবে এগুলির মান, একটি ফাংশন, একটি সম্পত্তি তালিকা এবং একটি প্যাকেজও থাকতে পারে। সুতরাং চিহ্নগুলি ভেরিয়েবল বা ফাংশনগুলির নামকরণে ব্যবহার করা যেতে পারে। সম্পত্তি তালিকাটি সাধারণত প্রতীকগুলিতে মেটা-ডেটা যুক্ত করতে ব্যবহৃত হয়।
3) চিহ্নগুলির গাছ ব্যবহার করে কোডের জন্য একটি স্বরলিপি।
কোড উপস্থাপনের জন্য লিস্প তার বেসিক ডেটা স্ট্রাকচার ব্যবহার করে।
তালিকা (* 3 2) উভয় ডেটা এবং কোড হতে পারে:
(eval '(* 3 (+ 2 5))) -> 21
(length '(* 3 (+ 2 5))) -> 3
গাছটি:
CL-USER 8 > (sdraw '(* 3 (+ 2 5)))
[*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
* 3 [*|*]--->[*|*]--->[*|*]--->NIL
| | |
v v v
+ 2 5
4) পুরো ভাষা সর্বদা উপলব্ধ। পঠন-সময়, সংকলন-সময় এবং রানটাইমের মধ্যে কোনও বাস্তব পার্থক্য নেই। আপনি সংকলন করতে বা কোড রান করতে, সংকলনের সময় কোডটি পড়তে বা চালাতে এবং রানটাইম সময়ে কোডটি পড়তে বা সংকলন করতে পারেন।
লিস্প পাঠ্য থেকে ডেটা এবং কোড পড়ার জন্য ফাংশনগুলি রিড করে, কোড লোড করতে লোড করে, কোড মূল্যায়নের জন্য ইভাল, কোডটি সংকলনের জন্য কমপাইল এবং তথ্য এবং কোডে টেক্সট লিখতে প্রিন্ট দেয়।
এই ফাংশন সর্বদা উপলব্ধ। তারা দূরে যায় না। তারা যে কোনও প্রোগ্রামের অংশ হতে পারে। তার মানে যে কোনও প্রোগ্রাম সর্বদা - পড়তে, লোড করতে, alওয়াল করতে বা মুদ্রণ করতে পারে।
সি বা জাওয়ার মতো ভাষাগুলিতে এগুলি কীভাবে আলাদা?
এই ভাষাগুলি চিহ্ন হিসাবে ডেটা হিসাবে কোড বা কোড হিসাবে ডেটা রানটাইম মূল্যায়ন প্রদান করে না। সিতে ডেটা অবজেক্টগুলি সাধারণত টাইপ করা হয় না।
এলআইএসপি পারিবারিক ভাষা ব্যতীত অন্য কোন ভাষার কি এখন এই নির্মাণগুলি রয়েছে?
অনেক ভাষায় এর কিছু ক্ষমতা রয়েছে।
পার্থক্য:
লিস্পে এই ক্ষমতাগুলি ভাষায় ডিজাইন করা হয়েছে যাতে এগুলি ব্যবহার করা সহজ হয়।