স্ট্যাটিক্যালি টাইপযুক্ত পূর্ণ লিস্প বৈকল্পিক কি সম্ভব? এমনকি এটির মতো কিছু থাকার জন্যও কি তা বোঝা যায়? আমি বিশ্বাস করি একটি লিস্প ভাষার গুণাবলী এর সংজ্ঞাটির সরলতা। স্ট্যাটিক টাইপিং এই মূল নীতিতে আপস করবে?
স্ট্যাটিক্যালি টাইপযুক্ত পূর্ণ লিস্প বৈকল্পিক কি সম্ভব? এমনকি এটির মতো কিছু থাকার জন্যও কি তা বোঝা যায়? আমি বিশ্বাস করি একটি লিস্প ভাষার গুণাবলী এর সংজ্ঞাটির সরলতা। স্ট্যাটিক টাইপিং এই মূল নীতিতে আপস করবে?
উত্তর:
হ্যাঁ, এটি খুব সম্ভব, যদিও একটি স্ট্যান্ডার্ড এইচএম-স্টাইল টাইপ সিস্টেম সাধারণত বেশিরভাগ প্রতিচ্ছবিযুক্ত লিপ্প / স্কিম কোডের জন্য ভুল পছন্দ। সাম্প্রতিক ভাষার জন্য টাইপড র্যাকেটটি দেখুন যা স্থির টাইপিংয়ের সাথে একটি "সম্পূর্ণ লিস্প" (আরও বেশি স্কিমের মতো)।
Sexpr
।
coerce :: a->b
al প্রকার সুরক্ষা কোথায়?
eval
আপনি ফলাফলের পরীক্ষা করার জন্য কি আসে আউট, (একটি ফাংশন যে ইউনিয়ন টাইপ লাগে হিসাবে একই চুক্তি বিধ্বস্ত টাইপ করা নতুন কিছু নয় যা দেখতে প্রয়োজন String
এবং Number
)। এটি সম্পন্ন হতে পারে তা দেখার একটি অন্তর্নিহিত উপায় হ'ল আপনি এইচএম-স্ট্যাটিক্যালি-টাইপ করা ভাষায় একটি গতিময় টাইপ করা ভাষা লিখতে এবং ব্যবহার করতে পারেন ।
আপনি যা চান তা যদি স্থিরভাবে টাইপ করা ভাষা ছিল যা লিস্পের মতো দেখায় তবে আপনি এটি সহজেই করতে পারেন, আপনার ভাষাকে উপস্থাপন করে এমন একটি বিমূর্ত সিনট্যাক্স ট্রি সংজ্ঞায়িত করে এবং তারপরে এস-এক্সপ্রেশনগুলিতে সেই এএসটি ম্যাপিং করে। তবে আমি মনে করি না যে আমি ফলাফলটি লিস্পকে ডাকব।
আপনি যদি সিন্টেক্সের পাশাপাশি লিস্প-ওয়াই বৈশিষ্ট্যযুক্ত এমন কিছু চান, তবে এটি স্ট্যাটিকালি টাইপ করা ভাষার সাহায্যে করা সম্ভব। তবে লিস্পে এমন অনেকগুলি বৈশিষ্ট্য রয়েছে যা থেকে কার্যকর স্ট্যাটিক টাইপিংয়ের বাইরে পাওয়া শক্ত। উদাহরণস্বরূপ, আসুন তালিকার কাঠামো নিজেই দেখে নেওয়া যাক, কনস নামে পরিচিত , যা লিস্পের প্রাথমিক বিল্ডিং ব্লকটি তৈরি করে।
কনসকে একটি তালিকা বলা, যদিও এটি (1 2 3)
দেখতে একরকম মনে হচ্ছে, এটি কিছুটা মিসনোমার। উদাহরণস্বরূপ, এটি স্ট্যাটিকালি টাইপ করা তালিকার সাথে মোটেই তুলনীয় নয়, যেমন সি ++ এর std::list
অথবা হাস্কেলের তালিকার মতো। সেগুলি একক-মাত্রিক লিঙ্কযুক্ত তালিকা যেখানে সমস্ত ঘর একই ধরণের the লিস্প সুখে অনুমতি দেয় (1 "abc" #\d 'foo)
। এছাড়াও, আপনি তালিকাগুলির তালিকাগুলি কভার করতে আপনার স্ট্যাটিক-টাইপড তালিকাগুলি প্রসারিত করলেও এই সামগ্রীর ধরণের জন্য তালিকার প্রতিটি উপাদান একটি উপ তালিকা হতে পারে। আপনি ((1 2) 3 4)
তাদের মধ্যে প্রতিনিধিত্ব করবেন?
লিস্প কনসগুলি পাতাগুলি (পরমাণু) এবং শাখা (কনস) সহ একটি বাইনারি গাছ গঠন করে। তদুপরি, এ জাতীয় গাছের পাতাগুলিতে কোনও পরমাণু (নন-কনস) লিস্প টাইপ থাকতে পারে! এই কাঠামোর নমনীয়তাটিই লিস্পকে প্রতীকী গণনা, এএসটি এবং লিস্প কোড নিজেই রূপান্তর করতে এত ভাল করে তোলে!
সুতরাং আপনি স্ট্যাটিকালি টাইপ করা ভাষায় এই জাতীয় কাঠামোর মডেল করবেন কীভাবে? আসুন এটি হ্যাসকেলে চেষ্টা করুন, যার একটি অত্যন্ত শক্তিশালী এবং সুনির্দিষ্ট স্ট্যাটিক টাইপ সিস্টেম রয়েছে:
type Symbol = String
data Atom = ASymbol Symbol | AInt Int | AString String | Nil
data Cons = CCons Cons Cons
| CAtom Atom
আপনার প্রথম সমস্যাটি পরমাণুর ধরণের সুযোগ হতে চলেছে। স্পষ্টতই, আমরা যে সমস্ত ধরণের অবজেক্টগুলিকে কনসে ঘুরে বেড়াতে চাই তার সমস্ত ধরণের আচ্ছাদন করার জন্য পর্যাপ্ত নমনীয়তার কোনও প্রকার বাছাই করি নি। অ্যাটম ডাটা স্ট্রাকচারটি উপরে তালিকাভুক্ত হিসাবে প্রসারিত করার চেষ্টা করার পরিবর্তে (যা আপনি পরিষ্কারভাবে দেখতে পাচ্ছেন ভঙ্গুর), আসুন আমরা বলি যে আমাদের কাছে একটি মায়াবী টাইপ শ্রেণি ছিল Atomic
যা আমরা পারমাণবিক বানাতে চেয়েছিল এমন সমস্ত প্রকারের পার্থক্য করে। তারপরে আমরা চেষ্টা করতে পারি:
class Atomic a where ?????
data Atomic a => Cons a = CCons Cons Cons
| CAtom a
তবে এটি কাজ করবে না কারণ গাছের সমস্ত পরমাণু একই ধরণের হওয়া দরকার। আমরা চাই যে তারা পাতায় পাতায় আলাদা হতে পারে। আরও ভাল পদ্ধতির জন্য হাস্কেলের অস্তিত্বমূলক কোয়ানটিফায়ার ব্যবহার প্রয়োজন :
class Atomic a where ?????
data Cons = CCons Cons Cons
| forall a. Atomic a => CAtom a
তবে এখন আপনারা বিষয়টি নিয়ে আসেন। এই ধরণের কাঠামোতে আপনি পরমাণুগুলি দিয়ে কী করতে পারেন? তাদের মধ্যে কী কাঠামো মিল রয়েছে যা দিয়ে মডেল করা যেতে পারে Atomic a
? এই জাতীয় ধরণের সাথে কী স্তরের সুরক্ষা আপনি গ্যারান্টিযুক্ত? নোট করুন আমরা আমাদের টাইপ শ্রেণিতে কোনও ফাংশন যোগ করি নি, এবং এর একটি ভাল কারণ রয়েছে: লিস্পে অণুগুলি সাধারণ কিছু ভাগ করে না। লিস্পে তাদের সুপারটাইপটিকে কেবল t
(অর্থাত্ শীর্ষ) বলা হয় ।
এগুলি ব্যবহার করার জন্য, আপনাকে বাস্তবে ব্যবহার করতে পারেন এমন কোনও কিছুতে পরমাণুর মানকে গতিশীলভাবে বাধ্য করার জন্য আপনাকে প্রক্রিয়াগুলি নিয়ে আসতে হবে । এবং এই মুহুর্তে, আপনি মূলত আপনার স্থিতিযুক্ত ভাষার মধ্যে একটি গতিময় টাইপযুক্ত সাবসিস্টেমটি প্রয়োগ করেছেন! ( গ্রীনস্পানের দশম প্রোগ্রামের প্রোগ্রামিং-এর একটি সম্ভাব্য ol ণপত্রের সাহায্যে কেউ সহায়তা করতে পারে না ))
নোট করুন যে হাস্কেল একটি প্রকারের সাথে কেবল এই জাতীয় গতিশীল সাবসিস্টেমের জন্য আমাদের শ্রেণিকে প্রতিস্থাপন করার জন্য Obj
একটি Dynamic
প্রকার এবং একটি টাইপযোগ্য শ্রেণীর সাথে একযোগে ব্যবহার করে Atomic
, যা স্বেচ্ছাসেবী মানগুলিকে তাদের প্রকারের সাথে সঞ্চিত করতে দেয় এবং সেই ধরণের থেকে সুস্পষ্ট জবরদস্তি ফিরিয়ে দেয়। লিস্প কনস কাঠামোগুলি তাদের সম্পূর্ণ সাধারণতার সাথে কাজ করার জন্য আপনার প্রয়োজন সেই ধরণের সিস্টেম।
আপনি যা করতে পারেন তা অন্যভাবে চলে যান এবং একটি স্ট্যাটিকালি টাইপড সাবসিস্টেমটি মূলত গতিময় টাইপের ভাষার মধ্যে এম্বেড করা। এটি আপনাকে আপনার প্রোগ্রামের যে অংশগুলি আরও কঠোর প্রকারের প্রয়োজনীয়তার সুযোগ নিতে পারে তার জন্য স্ট্যাটিক প্রকারের চেকিংয়ের সুবিধা দেয়। এটি সিএমইউসিএল এর সুনির্দিষ্ট ধরণের চেকিংয়ের সীমিত আকারে গৃহীত পদ্ধতি বলে মনে হচ্ছে , উদাহরণস্বরূপ।
অবশেষে, দুটি পৃথক সাবসিস্টেম থাকার সম্ভাবনা রয়েছে, গতিশীল এবং স্ট্যাটিকালি টাইপ করা হয়েছে যেগুলি চুক্তির-শৈলীর প্রোগ্রামিং ব্যবহার করে উভয়ের মধ্যে উত্তরণ নেভিগেট করতে সহায়তা করে। ভাষা লিস্পের ব্যবহারগুলিকে সামঞ্জস্য করতে পারে যেখানে স্থির ধরণের চেকিং সাহায্যের চেয়ে বাধা হয়ে দাঁড়াবে এবং পাশাপাশি স্থির প্রকারের পরীক্ষা করা সুবিধাজনক হবে uses এটি টাইপড র্যাকেটের গৃহীত পদ্ধতি , যা আপনি পরবর্তী মন্তব্যগুলি দেখবেন।
(Listof Integer)
এবং এর মতো জিনিসগুলি সহ (Listof Any)
। স্পষ্টতই, আপনি পরবর্তীটিকে অকেজো বলে সন্দেহ করবেন কারণ আপনি প্রকার সম্পর্কে কিছুই জানেন না, তবে টিআর-তে আপনি পরে ব্যবহার করতে পারেন (if (integer? x) ...)
এবং সিস্টেমটি জানবে যে x
এটি 1 ম শাখার একটি পূর্ণসংখ্যা।
dynamic
প্রথাগতভাবে টাইপ করা ভাষার কিছু উপকার পাওয়ার জন্য প্রকারগুলি স্থির ভাষায় এক ধরণের কাজ হিসাবে জনপ্রিয় হয়ে উঠছে, এই মানগুলির স্বাভাবিক ট্রেড অফকে এমনভাবে মুড়িয়ে দেওয়া হয় যাতে প্রকারগুলি সনাক্তকরণযোগ্য হয়। তবে এখানেও টাইপ করা র্যাকেটটি ভাষার মধ্যে এটি সুবিধাজনক করে তোলার জন্য খুব ভাল কাজ করছে - প্রকারটি সম্পর্কে আরও জানার জন্য টাইপ চেকার পূর্বাভাসের ঘটনাগুলি ব্যবহার করে। উদাহরণস্বরূপ, র্যাকেট পৃষ্ঠায় টাইপ করা উদাহরণটি দেখুন string?
এবং স্ট্রিংগুলির একটি তালিকাতে স্ট্রিং এবং সংখ্যার তালিকা কীভাবে "হ্রাস" করে তা দেখুন।
আমার উত্তর, একটি উচ্চ ডিগ্রী ছাড়া আত্মবিশ্বাস সম্ভবত । উদাহরণস্বরূপ, যদি আপনি এসএমএল এর মতো কোনও ভাষা দেখে থাকেন এবং লিস্পের সাথে এটি তুলনা করেন, তবে প্রতিটিটির কার্যকরী মূলটি প্রায় অভিন্ন। ফলস্বরূপ, দেখে মনে হয় না যে আপনি লিস্পের মূল স্থানে (ফাংশন অ্যাপ্লিকেশন এবং আদিম মান) কোনও ধরণের স্ট্যাটিক টাইপিং প্রয়োগ করতে খুব সমস্যা হবেন।
আপনার প্রশ্নটি যদিও পুরোপুরি বলে না, এবং যেখানে আমি কিছুটা সমস্যা দেখছি তা হ'ল কোড-অ্যাস-ডেটা পদ্ধতির। প্রকারের চেয়ে আরও বিমূর্ত স্তরে প্রকারগুলি বিদ্যমান। লিস্পের এই পার্থক্য নেই - সবকিছু কাঠামোর মধ্যে "সমতল"। যদি আমরা কিছু অভিব্যক্তি E: T (যেখানে টি এর ধরণের কিছু উপস্থাপনা) বিবেচনা করে, এবং তারপরে আমরা এই অভিব্যক্তিটিকে সরল ওল 'ডেটা হিসাবে বিবেচনা করি, তবে এখানে টি এর ধরণটি ঠিক কী? ভাল, এটা এক ধরনের! একটি ধরনের হ'ল একটি উচ্চতর, আদেশের ধরণ, সুতরাং আসুন আমরা এগিয়ে যাই এবং আমাদের কোডে সে সম্পর্কে কিছু বলি:
E : T :: K
আপনি দেখতে পাবেন আমি এই কোথায় যাচ্ছি। আমি নিশ্চিত যে কোড থেকে প্রকারের তথ্যকে আলাদা করে এই ধরণের স্ব-রেফারেন্সিয়ালিটি এড়ানো সম্ভব হবে, তবে এটি তাদের স্বাদে প্রকারগুলিকে খুব বেশি "লিপ্প" না করে তোলে। এটি প্রায় বেশ কয়েকটি উপায় আছে যদিও আমার কাছে এটি স্পষ্ট নয় যেটি সবচেয়ে ভাল।
সম্পাদনা: ওহ, তাই কিছুটা গুগল করে, আমি কিউই পেয়েছি , যা লিস্পের সাথে একেবারে মিল রয়েছে বলে মনে হচ্ছে এটি স্ট্যাটিকালি টাইপ করা হয়েছে। সেখানে স্ট্যাটিক টাইপিংয়ের জন্য তারা কোথায় পরিবর্তন করেছে তা দেখার জন্য এটি খুব ভাল জায়গা।