লিস্পে পল গ্রাহামের কয়েকটি বিষয় ব্যাখ্যা করুন


146

পল গ্রাহামের হোয়াট মেড মেড লিস্প ডিফরেনেন্টের কয়েকটি বিষয় বুঝতে আমার কিছুটা সহায়তা দরকার ।

  1. পরিবর্তনশীলগুলির একটি নতুন ধারণা। লিস্পে, সমস্ত ভেরিয়েবল কার্যকরভাবে পয়েন্টার হয়। মানগুলি হ'ল প্রকারগুলি রয়েছে, ভেরিয়েবলগুলি নয় এবং ভেরিয়েবলগুলি নির্ধারণ করা বা বাঁধাই করার অর্থ পয়েন্টারগুলি অনুলিপি করা হয়, তারা কী দেখায় তা নয়।

  2. একটি প্রতীক প্রকার। চিহ্নগুলি স্ট্রিং থেকে পৃথক যে আপনি একটি পয়েন্টারের সাথে তুলনা করে সমতা পরীক্ষা করতে পারেন।

  3. চিহ্নগুলির গাছ ব্যবহার করে কোডের জন্য একটি স্বরলিপি।

  4. পুরো ভাষা সর্বদা উপলব্ধ। পঠন-সময়, সংকলন-সময় এবং রানটাইমের মধ্যে কোনও বাস্তব পার্থক্য নেই। আপনি সংকলন করতে বা কোড রান করতে, সংকলনের সময় কোডটি পড়তে বা চালাতে এবং রানটাইম সময়ে কোডটি পড়তে বা সংকলন করতে পারেন।

এই পয়েন্টগুলির অর্থ কী? সি বা জাওয়ার মতো ভাষাগুলিতে এগুলি কীভাবে আলাদা? লিস্প পারিবারিক ভাষা ব্যতীত অন্য কোন ভাষার কি এখন এই নির্মাণগুলি রয়েছে?


10
আমি নিশ্চিত নই যে ফাংশনাল-প্রোগ্রামিং ট্যাগটি এখানে সাজানো হয়েছে, কারণ কার্যকরী কোড লেখার জন্য অনেক লিপসে অপরিহার্য বা ওও কোড লেখা সমানভাবে সম্ভব - এবং বাস্তবে প্রচুর অ-কার্যকরী লিস্প রয়েছে চারপাশে কোড আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এফপি ট্যাগটি সরিয়ে এর পরিবর্তে ক্লোজার যুক্ত করুন - আশা করি এটি জেভিএম-ভিত্তিক লিস্পার্স থেকে কিছু আকর্ষণীয় ইনপুট আনতে পারে।
মাইচা মার্ক্সিক

58
আমাদেরও paul-grahamএখানে ট্যাগ আছে? !!! দুর্দান্ত ...
অনুপস্থিত

@ মিসিংফ্যাক্টর সম্ভবত এটির জন্য একটি অনুরোধ প্রয়োজন
বিড়াল

উত্তর:


98

ম্যাট এর ব্যাখ্যা পুরোপুরি ঠিক আছে - এবং সে সি এবং জাভা এর সাথে তুলনা করে একটি শট নেয় যা আমি করব না - তবে কোনও কারণে আমি সত্যিই একবারে একবারে এই বিষয়টি নিয়ে আলোচনা করা উপভোগ করি, তাই - আমার শটটি এখানে একটি উত্তরে।

(3) এবং (4) পয়েন্টগুলিতে:

আপনার তালিকার পয়েন্ট (3) এবং (4) এখন সবচেয়ে আকর্ষণীয় এবং এখনও প্রাসঙ্গিক বলে মনে হচ্ছে।

তাদের বোঝার জন্য, প্রোগ্রামার দ্বারা টাইপ করা অক্ষরের একটি ধারা হিসাবে - মৃত্যুদন্ড কার্যকর হওয়ার পথে - লিস্প কোড দিয়ে কী ঘটেছিল তার একটি স্পষ্ট চিত্র থাকা কার্যকর। আসুন একটি কংক্রিট উদাহরণ ব্যবহার করুন:

;; a library import for completeness,
;; we won't concern ourselves with it
(require '[clojure.contrib.string :as str])

;; this is the interesting bit:
(println (str/replace-re #"\d+" "FOO" "a123b4c56"))

ক্লোজার কোডটির এই স্নিপেট প্রিন্ট করেaFOObFOOcFOO । নোট করুন যে ক্লোজুর তর্কসাপেক্ষভাবে আপনার তালিকার চতুর্থ পয়েন্টটি সম্পূর্ণরূপে সন্তুষ্ট করে না, যেহেতু পঠন-সময়টি সত্যই ব্যবহারকারীর কোডের জন্য উন্মুক্ত নয়; যদিও এটি অন্যথায় হওয়ার অর্থ কী তা নিয়ে আমি আলোচনা করব।

সুতরাং, ধরুন আমরা এই কোডটি একটি ফাইলের মধ্যে কোথাও পেয়েছি এবং আমরা ক্লজুরকে এটি কার্যকর করতে বলি। এছাড়াও, ধরে নেওয়া যাক (সরলতার জন্য) আমরা এটি লাইব্রেরি আমদানি করে ফেলেছি। আকর্ষণীয় বিট শুরু (printlnএবং )ডানদিক থেকে শেষ হয় । এটি যেমনটি প্রত্যাশা করা হয় ঠিক তেমন লেক্সড / পার্স করা হয়েছে তবে ইতিমধ্যে একটি গুরুত্বপূর্ণ বিষয় উত্থাপিত হয়েছে: ফলাফলটি কোনও বিশেষ সংকলক-নির্দিষ্ট এএসটির উপস্থাপনা নয় - এটি কেবল একটি নিয়মিত ক্লোজার / লিস্প ডেটা কাঠামো , যথা একটি নেস্টেড তালিকা যা প্রতীকগুলির একটি গুচ্ছ রয়েছে, স্ট্রিং এবং - এই ক্ষেত্রে - এর সাথে সম্পর্কিত একটি একক সংকলিত রেজেক্স প্যাটার্ন অবজেক্ট#"\d+"আক্ষরিক (নীচে এটি আরও)। কিছু লিপস এই প্রক্রিয়াটিতে তাদের নিজস্ব সামান্য টুইস্টগুলি যুক্ত করে, তবে পল গ্রাহাম বেশিরভাগই কমন লিস্পের কথা উল্লেখ করেছিলেন। আপনার প্রশ্নের সাথে সম্পর্কিত পয়েন্টগুলিতে, ক্লোজুর সিএল এর অনুরূপ।

সংকলনের সময় পুরো ভাষা:

এই বিন্দুর পরে, সমস্ত সংকলক ডিল করে (এটি একটি লিস্প ইন্টারপ্রেটারের ক্ষেত্রেও সত্য হবে; ক্লোজার কোডটি সর্বদা সংকলিত হওয়ার জন্য ঘটে থাকে) হ'ল লিস্প ডেটা স্ট্রাকচার যা লিস্প প্রোগ্রামারদের হেরফেরে ব্যবহৃত হয়। এই মুহুর্তে একটি দুর্দান্ত সম্ভাবনা স্পষ্ট হয়ে ওঠে: কেন লিস্প প্রোগ্রামারদের লিপ্প ফাংশনগুলি লেখার মঞ্জুরি দেয় না যা লিপ্প প্রোগ্রামগুলিকে প্রতিনিধিত্ব করে এবং পরিবর্তিত প্রোগ্রামগুলির প্রতিনিধিত্বকারী আউটপুট ট্রান্সফর্মড ডেটা ব্যবহার করে, লিস্টের কার্যকারিতা লিখতে দেয় না কেন? অন্য কথায় - কেন লিস্প প্রোগ্রামাররা তাদের ফাংশনগুলিকে লিস্পে ম্যাক্রো নামক ধরণের সংকলক প্লাগইন হিসাবে নিবন্ধিত করতে দেয় না? এবং প্রকৃতপক্ষে যে কোনও শালীন লিস্প সিস্টেমের এই ক্ষমতা রয়েছে।

সুতরাং, প্রকৃত অবজেক্ট কোড নির্গত হওয়ার পরে চূড়ান্ত সংকলন পর্বের আগে ম্যাক্রোগগুলি হ'ল নিয়মিত লিস্প ফাংশনগুলি হ'ল সংকলন সময়ে প্রোগ্রামমের প্রতিনিধিত্ব করে operating যেহেতু কোড ম্যাক্রোগুলির ধরণের কোনও সীমাবদ্ধতা নেই (বিশেষত, তারা যে কোডটি চালায় তা প্রায়শই ম্যাক্রো সুবিধার উদার ব্যবহারের সাথে লেখা হয়), তাই কেউ বলতে পারেন যে "সম্পূর্ণ ভাষাটি সংকলনের সময়ে উপলব্ধ "।

পড়ার সময় পুরো ভাষা:

আসুন আমরা সেই #"\d+"রেইজেক্স আক্ষরিক ফিরে যাই । উপরে উল্লিখিত হিসাবে, সংকলকটি নতুন কোড সংকলনের জন্য প্রস্তুত হওয়ার প্রথম উল্লেখ শোনার আগে, পড়ার সময় এটি একটি প্রকৃত সংকলিত প্যাটার্ন অবজেক্টে রূপান্তরিত হয়। এটা কীভাবে হয়?

হ্যাঁ, ক্লোজুর বর্তমানে যেভাবে বাস্তবায়িত হয়েছে, পল গ্রাহামের মনে যে চিত্রটি ছিল তা তার চেয়ে কিছুটা আলাদা, যদিও চালাক হ্যাক দিয়ে কিছুই সম্ভব । কমন লিস্পে, গল্পটি ধারণাগতভাবে কিছুটা পরিষ্কার হতে পারে। বেসিকগুলি তবে একই রকম: লিস্প রিডার একটি রাষ্ট্র মেশিন যা রাষ্ট্রীয় রূপান্তর সম্পাদন এবং অবশেষে এটি "গ্রহণযোগ্য রাষ্ট্র" এ পৌঁছেছে কিনা তা ঘোষণার পাশাপাশি অক্ষরগুলির প্রতিনিধিত্ব করে লিস্প ডেটা স্ট্রাকচারকে ছড়িয়ে দেয়। এইভাবে অক্ষর ইত্যাদি 123হয়ে যায় 123ইত্যাদি গুরুত্বপূর্ণ পয়েন্টটি এখন আসে: এই রাষ্ট্রীয় মেশিনটি ব্যবহারকারীর কোড দ্বারা সংশোধিত হতে পারে। (যেমনটি আগেই উল্লেখ করা হয়েছে, সিএল-এর ক্ষেত্রে এটি সম্পূর্ণ সত্য; ক্লোজারের জন্য একটি হ্যাক (নিরুৎসাহিত এবং ব্যবহারে ব্যবহার করা হয়নি) প্রয়োজন। তবে আমি ডিজগারকে বলেছি, এটি পিজির নিবন্ধটি আমার বিশদভাবে বর্ণনা করার কথা, তাই ...)

সুতরাং, যদি আপনি একটি কমন লিস্প প্রোগ্রামার হন এবং ক্লোজার-স্টাইল ভেক্টর লিটারালগুলির ধারণাটি আপনি পছন্দ করেন তবে আপনি কিছু চরিত্রের ক্রম - [বা #[সম্ভবত - যথাযথ প্রতিক্রিয়া জানানোর জন্য পাঠককে একটি ফাংশন প্লাগ করতে পারেন - এবং এটি হিসাবে ট্রিট করুন ম্যাচ শেষে ভেক্টর আক্ষরিক শেষের শুরু ]। এই জাতীয় ফাংশনটিকে একটি পাঠক ম্যাক্রো বলা হয় এবং ঠিক নিয়মিত ম্যাক্রোর মতোই এটি লিস্প কোডের যে কোনও ধরণের ক্রিয়াকলাপ সম্পাদন করতে পারে যার কোডটি নিজেই পূর্বে নিবন্ধিত পাঠক ম্যাক্রো দ্বারা সক্রিয় ফানকি স্বরলিপি দ্বারা রচিত হয়েছিল। সুতরাং আপনার জন্য পঠনের সময় পুরো ভাষা রয়েছে।

এটিকে মোড়ানো:

আসলে, এখন পর্যন্ত যা প্রদর্শিত হয়েছে তা হ'ল যে কেউ পড়ার সময় বা সংকলনের সময় নিয়মিত লিস্প ফাংশন পরিচালনা করতে পারে; পড়া, সংকলন বা রান করার সময় পড়া এবং সংকলন কীভাবে নিজেরাই সম্ভব তা বোঝার জন্য এখান থেকে যে পদক্ষেপটি নেওয়া দরকার তা বুঝতে পেরেছি যে পড়া এবং সংকলন নিজেই লিস্প ফাংশন দ্বারা সম্পাদিত হয়। আপনি কেবলমাত্র অক্ষর প্রবাহগুলি থেকে লিস্প ডেটাতে কল করতে readবা evalযে কোনও সময় যথাক্রমে লিস্প কোডটি সংকলন ও সম্পাদন করতে পারেন। এটাই হ'ল পুরো ভাষা time

আপনার তালিকা থেকে লিস্প কীভাবে বিন্দু (3) কে সন্তুষ্ট করে তা যেভাবে এটি বিন্দু (4) পূরণ করতে পরিচালিত করে তার জন্য কীভাবে প্রয়োজনীয় তা নোট করুন - লিস্পের প্রদত্ত ম্যাক্রোগুলির বিশেষ স্বাদটি নিয়মিত লিস্প ডেটা দ্বারা প্রতিনিধিত্ব করা কোডের উপর নির্ভর করে, যা (3) দ্বারা সক্ষম কিছু। ঘটনাক্রমে, কোডটির কেবলমাত্র "ট্রি-ইশ" দিকটি এখানে সত্যই গুরুত্বপূর্ণ X


4
সতর্কতা: "নিয়মিত (সংকলক) ম্যাক্রো" বলার মাধ্যমে আপনি বোঝাচ্ছেন যে সংকলক ম্যাক্রোগুলি "নিয়মিত" ম্যাক্রো, যখন কমন লিস্পে (কমপক্ষে), "সংকলক ম্যাক্রো" একটি খুব নির্দিষ্ট এবং আলাদা জিনিস: লিসপওয়ার্কস। com / ডকুমেন্টেশন / lw51 / সিএলএইচএস / দেহ /…
কেন

কেন: ভাল ধরা, ধন্যবাদ! আমি এটিকে "নিয়মিত ম্যাক্রো" এ পরিবর্তন করব, যা আমার মনে হয় কারও সাথে ভ্রমণ করা সম্ভব নয়।
মিশা মারকজেক

চমত্কার উত্তর। প্রশ্নটি গুগল করা / ভাবতে ঘণ্টার চেয়ে আমি 5 মিনিটের মধ্যে এ থেকে আরও শিখেছি। ধন্যবাদ।
চার্লি ফুল

সম্পাদনা: আরগ করুন, একটি রান-অন বাক্যকে ভুল বুঝেছেন। ব্যাকরণের জন্য সংশোধন করা হয়েছে (আমার সম্পাদনা স্বীকার করার জন্য "পিয়ার" দরকার)।
তাতিয়ানা রাচেভা

এস-এক্সপ্রেশন এবং এক্সএমএল একই কাঠামো নির্ধারণ করতে পারে তবে এক্সএমএল অনেক বেশি ভার্বোজ এবং তাই বাক্য গঠন হিসাবে উপযুক্ত নয়।
সিলেস্টার

66

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ওয়াল করতে বা মুদ্রণ করতে পারে।

সি বা জাওয়ার মতো ভাষাগুলিতে এগুলি কীভাবে আলাদা?

এই ভাষাগুলি চিহ্ন হিসাবে ডেটা হিসাবে কোড বা কোড হিসাবে ডেটা রানটাইম মূল্যায়ন প্রদান করে না। সিতে ডেটা অবজেক্টগুলি সাধারণত টাইপ করা হয় না।

এলআইএসপি পারিবারিক ভাষা ব্যতীত অন্য কোন ভাষার কি এখন এই নির্মাণগুলি রয়েছে?

অনেক ভাষায় এর কিছু ক্ষমতা রয়েছে।

পার্থক্য:

লিস্পে এই ক্ষমতাগুলি ভাষায় ডিজাইন করা হয়েছে যাতে এগুলি ব্যবহার করা সহজ হয়।


33

পয়েন্টগুলির জন্য (1) এবং (2), তিনি historতিহাসিকভাবে কথা বলছেন। জাভা এর ভেরিয়েবলগুলি বেশ একই রকম, এজন্য মানগুলি তুলনা করতে আপনাকে .equals () কল করতে হবে।

(3) এস এক্সপ্রেশন সম্পর্কে কথা বলছে। এই সিনট্যাক্সটিতে লিসপ প্রোগ্রামগুলি লেখা হয়, যা জাভা এবং সি এর মতো অ্যাড-হক সিনট্যাক্সের উপরে প্রচুর সুবিধা সরবরাহ করে যেমন সি ম্যাক্রো বা সি ++ টেমপ্লেটগুলির তুলনায় ম্যাক্রোগুলিতে পুনরাবৃত্ত প্যাটার্নগুলি আরও পরিষ্কার পদ্ধতিতে ক্যাপচার করা এবং একই মূল তালিকার সাথে কোডটি ম্যানিপুলেটিং করা as আপনি ডেটা জন্য ব্যবহার অপারেশন।

(4) সি গ্রহণের উদাহরণস্বরূপ: ভাষাটি আসলে দুটি পৃথক উপ ভাষা: যেমন () এবং (যখন), এবং প্রিপ্রসেসর হিসাবে স্টাফ। আপনি সর্বদা নিজেকে পুনরুক্ত করে বাঁচাতে প্রিপ্রসেসর ব্যবহার করুন বা # if / # ifdef দিয়ে কোড এড়িয়ে যান। তবে উভয় ভাষা একেবারেই পৃথক এবং সংকলনের সময় আপনি () ব্যবহার করতে পারবেন না যেমন আপনি #if করতে পারেন।

সি ++ এটি টেমপ্লেটগুলির সাথে আরও খারাপ করে তোলে। টেমপ্লেট মেটাপগ্রোমিংয়ের কয়েকটি রেফারেন্স দেখুন, যা সংকলন সময়ে কোড উত্পন্ন করার একটি উপায় সরবরাহ করে এবং অ-বিশেষজ্ঞদের পক্ষে তাদের মাথা গুটিয়ে রাখা অত্যন্ত কঠিন। এছাড়াও, এটি টেমপ্লেট এবং ম্যাক্রোগুলি ব্যবহার করে হ্যাকস এবং ট্রিকসগুলির একটি গোছা যা সংকলক প্রথম শ্রেণির সমর্থন সরবরাহ করতে পারে না - আপনি যদি একটি সাধারণ বাক্য গঠন ত্রুটি করেন তবে সংকলক আপনাকে একটি পরিষ্কার ত্রুটি বার্তা দিতে অক্ষম।

ঠিক আছে, লিস্পের সাহায্যে আপনার কাছে এটি একক ভাষায় রয়েছে। আপনি প্রথম দিনটিতে যেমন শিখবেন রান চলাকালীন সময়ে কোড তৈরি করতে আপনি একই জিনিস ব্যবহার করেন। এটি রূপান্তরকে তুচ্ছ বলে মনে করা যায় না, তবে এটি প্রথম শ্রেণীর ভাষা এবং সংকলক সমর্থন সহ আরও সহজবোধ্য।


7
ওহ, এই শক্তি (এবং সরলতা) এখন 50 বছরেরও বেশি পুরানো, এবং এটি বাস্তবায়নের পক্ষে যথেষ্ট সহজ যে কোনও নবাগত প্রোগ্রামার এটি ন্যূনতম দিকনির্দেশনা দিয়ে ঠাঁই করতে পারে এবং ভাষার মৌলিক বিষয়গুলি সম্পর্কে জানতে পারে। আপনি একটি ভাল শিক্ষানবিশ প্রকল্প হিসাবে জাভা, সি, পাইথন, পার্ল, হাস্কেল ইত্যাদির অনুরূপ দাবি শুনতে পাবেন না!
ম্যাট কার্টিস

9
আমি জাভা ভেরিয়েবলগুলি মোটেও লিস্পের প্রতীকের মতো বলে মনে করি না। জাভাতে একটি চিহ্নের জন্য কোনও স্বরলিপি নেই এবং আপনি কেবলমাত্র একটি ভেরিয়েবলের সাথে করতে পারেন তা হল এর মান ঘর cell স্ট্রিংগুলি অভ্যন্তরীণ করা যেতে পারে তবে সেগুলি সাধারণত নাম নয়, তাই তাদের উদ্ধৃতি, মূল্যায়ন, উত্তীর্ণ করা যায় কিনা ইত্যাদি বিষয়ে কথা বলা এমনকি বুদ্ধিমান হয় না
কেন

2
৪০ বছরের বেশি বয়সী হতে পারে আরও নির্ভুল :), @ কেন: আমার মনে হয় তার অর্থ যে 1) জাভাতে অ-আদিম পরিবর্তনগুলি রিফায়েন্স দ্বারা হয়, যা লিস্পের মতো এবং 2) জাভাতে অভ্যন্তরীণ স্ট্রিংগুলি লিস্পে চিহ্নগুলির অনুরূপ - অবশ্যই আপনি যেমন বলেছিলেন, আপনি জাভাতে ইন্টার্নড স্ট্রিং / কোড উদ্ধৃত করতে বা বাছাই করতে পারবেন না, তাই তারা এখনও একেবারেই আলাদা।

3
@ ড্যান - প্রথম বাস্তবায়ন কখন একসাথে করা হয়েছিল তা নিশ্চিত নয়, তবে 1960 সালে প্রতীকী গণনার প্রাথমিক ম্যাককার্টি কাগজ প্রকাশিত হয়েছিল।
ইনাইমথি

জাভাতে Foo.class / foo.getClass () আকারে "চিহ্নগুলি" এর জন্য আংশিক / অনিয়মিত সমর্থন রয়েছে - অর্থাত একটি ধরণের শ্রেণীর <Foo> অবজেক্টটি কিছুটা সাদৃশ্যযুক্ত - যেমন এনাম মানগুলি একটি ডিগ্রী. তবে লিস্পের প্রতীকের খুব ন্যূনতম ছায়া।
বিআরপোকক

-3

পয়েন্টস (1) এবং (2) পাইথন ফিট করবে। "A = str (82.4)" সরল উদাহরণ গ্রহণ করে দোভাষী প্রথমে 82.4 মান সহ একটি ভাসমান পয়েন্ট অবজেক্ট তৈরি করে। তারপরে এটি স্ট্রিং কনস্ট্রাক্টরকে কল করে যা তারপরে '82 .4 'মানের সাথে একটি স্ট্রিং প্রদান করে। বাম দিকে 'ক' কেবল স্ট্রিং অবজেক্টের জন্য একটি লেবেল। মূল ভাসমান পয়েন্ট অবজেক্টটি আবর্জনা সংগ্রহ করা হয়েছিল কারণ এর সাথে আর কোনও উল্লেখ নেই।

স্কিমে সমস্ত কিছুকে একইভাবে আচরণ করা হয়। আমি কমন লিস্প সম্পর্কে নিশ্চিত নই আমি সি / সি ++ ধারণার ক্ষেত্রে চিন্তাভাবনা এড়াতে চেষ্টা করব। আমি যখন লিসপসের সুন্দর সরলতার চারপাশে আমার মাথা পেতে চেষ্টা করছিলাম তখন তারা আমাকে স্তূপের গতি কমিয়ে দিয়েছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.