স্ট্যাটিক্যালি টাইপযুক্ত পূর্ণ লিস্প বৈকল্পিক কি সম্ভব?


107

স্ট্যাটিক্যালি টাইপযুক্ত পূর্ণ লিস্প বৈকল্পিক কি সম্ভব? এমনকি এটির মতো কিছু থাকার জন্যও কি তা বোঝা যায়? আমি বিশ্বাস করি একটি লিস্প ভাষার গুণাবলী এর সংজ্ঞাটির সরলতা। স্ট্যাটিক টাইপিং এই মূল নীতিতে আপস করবে?


10
আমি লিস্পের ফ্রিফর্ম ম্যাক্রোগুলি পছন্দ করি তবে আমি হাস্কেলের টাইপ সিস্টেমের দৃust়তা পছন্দ করি। স্ট্যাটিালি টাইপড লিস্প দেখতে কেমন তা দেখতে আমি পছন্দ করি।
mcandre

4
ভাল প্রশ্ন! আমি বিশ্বাস করি শেনল্যাঙ্গোজিআরএইজ এটি করে। আমি আশা করি এটি আরও মূলধারার হয়ে উঠবে।
হামিশ গ্রুবিজন


আপনি কীভাবে হাস্কেলের সাথে প্রতীকী কম্পিউটিং করবেন? ('x' (= (+ xy)) (* xy)) সমাধান করুন। যদি আপনি এটি স্ট্রিংয়ে রাখেন তবে সেখানে কোনও চেকিং নেই (লিস্পের বিপরীতে যা চেক যোগ করতে ম্যাক্রো ব্যবহার করতে পারে)। আপনি যদি বীজগণিত তথ্য প্রকার বা তালিকাগুলি ব্যবহার করেন ... এটি খুব ভার্জোজ হবে: সমাধান করুন (Sym "x") (Eq (Plus (Sym "x") (Sym "y")) (বহু (Sym "x") (সিম "y"))
এওউ 256

উত্তর:


57

হ্যাঁ, এটি খুব সম্ভব, যদিও একটি স্ট্যান্ডার্ড এইচএম-স্টাইল টাইপ সিস্টেম সাধারণত বেশিরভাগ প্রতিচ্ছবিযুক্ত লিপ্প / স্কিম কোডের জন্য ভুল পছন্দ। সাম্প্রতিক ভাষার জন্য টাইপড র‌্যাকেটটি দেখুন যা স্থির টাইপিংয়ের সাথে একটি "সম্পূর্ণ লিস্প" (আরও বেশি স্কিমের মতো)।


1
এখানে সমস্যাটি হল, তালিকার ধরণটি কী ধরণের যা টাইপড র‌্যাকেট প্রোগ্রামের পুরো উত্স কোডটি তৈরি করে?
জোরফ

18
যে সাধারণত হবে Sexpr
এলি বারজিলে

তবে তারপরেও আমি লিখতে পারি coerce :: a->bal প্রকার সুরক্ষা কোথায়?
ssice

2
@ssice: যদি আপনি একটি untyped ফাংশন ব্যবহার করে থাকেন তখন মত evalআপনি ফলাফলের পরীক্ষা করার জন্য কি আসে আউট, (একটি ফাংশন যে ইউনিয়ন টাইপ লাগে হিসাবে একই চুক্তি বিধ্বস্ত টাইপ করা নতুন কিছু নয় যা দেখতে প্রয়োজন Stringএবং Number)। এটি সম্পন্ন হতে পারে তা দেখার একটি অন্তর্নিহিত উপায় হ'ল আপনি এইচএম-স্ট্যাটিক্যালি-টাইপ করা ভাষায় একটি গতিময় টাইপ করা ভাষা লিখতে এবং ব্যবহার করতে পারেন
এলি বারজিলে

37

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

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

কনসকে একটি তালিকা বলা, যদিও এটি (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 এটি টাইপড র‌্যাকেটের গৃহীত পদ্ধতি , যা আপনি পরবর্তী মন্তব্যগুলি দেখবেন।


16
এই উত্তরটি একটি মৌলিক সমস্যায় ভুগছে: আপনি ধরে নিচ্ছেন যে স্ট্যাটিক টাইপ সিস্টেমগুলি অবশ্যই এইচএম-স্টাইলের হতে হবে । সেখানে যে মূল ধারণাটি প্রকাশ করা যায় না এবং লিস্প কোডের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য তা সাবটিপিং হয়। আপনি যদি টাইপড র‌্যাকেটটি একবার দেখুন, আপনি দেখতে পাবেন যে এটি সহজেই কোনও ধরণের তালিকা প্রকাশ করতে পারে - যেমন (Listof Integer)এবং এর মতো জিনিসগুলি সহ (Listof Any)। স্পষ্টতই, আপনি পরবর্তীটিকে অকেজো বলে সন্দেহ করবেন কারণ আপনি প্রকার সম্পর্কে কিছুই জানেন না, তবে টিআর-তে আপনি পরে ব্যবহার করতে পারেন (if (integer? x) ...)এবং সিস্টেমটি জানবে যে xএটি 1 ম শাখার একটি পূর্ণসংখ্যা।
এলি বারজিলে

5
ওহ, এবং এটি টাইপড র‌্যাকেটের একটি খারাপ বৈশিষ্ট্য (যা আপনি কিছু জায়গায় খুঁজে পাওয়ার মতো আনসাউন্ড টাইপ সিস্টেমের চেয়ে আলাদা)। টাইপ করা কোলাহল হয় একটি স্ট্যাটিক্যালি টাইপ টাইপ কোডের জন্য কোন রানটাইম ওভারহেড সঙ্গে, ভাষা। র‌্যাকেটটি এখনও টিআরতে কিছু কোড এবং কিছুটিকে সাধারণ টাইপযুক্ত ভাষায় লেখার অনুমতি দেয় - এবং এই ক্ষেত্রে চুক্তিগুলি (ডাইনামিক চেক) ব্যবহার করা হয় টাইপ কোডটি সম্ভাব্যভাবে অপব্যবহার করা কোড থেকে রক্ষা করতে।
এলি বারজিলে

1
@ এলি বারজিলে: আমি মিথ্যা বললাম, এর চারটি অংশ রয়েছে: ৪. এটি আমার কাছে আকর্ষণীয় যে শিল্প-গৃহীত সি ++ কোডিং স্টাইলটি জেনারিকের দিকে সাবটিপিং থেকে ধীরে ধীরে কীভাবে সরছে। দুর্বলতা হ'ল যে জেনেরিক ফাংশনটি ইন্টারফেসটি ব্যবহার করতে চলেছে তা ঘোষণার জন্য ভাষা সহায়তা দেয় না, কিছু ধরণের শ্রেণি অবশ্যই এতে সহায়তা করতে পারে। প্লাস, সি ++ 0 এক্স প্রকারের অনুক্রম যুক্ত করতে পারে। এইচএম নয়, আমি মনে করি, তবে সেদিকে ক্রমান্বিত?
ওভেন এস

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

1
(২) হ্যাঁ, dynamicপ্রথাগতভাবে টাইপ করা ভাষার কিছু উপকার পাওয়ার জন্য প্রকারগুলি স্থির ভাষায় এক ধরণের কাজ হিসাবে জনপ্রিয় হয়ে উঠছে, এই মানগুলির স্বাভাবিক ট্রেড অফকে এমনভাবে মুড়িয়ে দেওয়া হয় যাতে প্রকারগুলি সনাক্তকরণযোগ্য হয়। তবে এখানেও টাইপ করা র‌্যাকেটটি ভাষার মধ্যে এটি সুবিধাজনক করে তোলার জন্য খুব ভাল কাজ করছে - প্রকারটি সম্পর্কে আরও জানার জন্য টাইপ চেকার পূর্বাভাসের ঘটনাগুলি ব্যবহার করে। উদাহরণস্বরূপ, র্যাকেট পৃষ্ঠায় টাইপ করা উদাহরণটি দেখুন string?এবং স্ট্রিংগুলির একটি তালিকাতে স্ট্রিং এবং সংখ্যার তালিকা কীভাবে "হ্রাস" করে তা দেখুন।
এলি বারজিলে

10

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

আপনার প্রশ্নটি যদিও পুরোপুরি বলে না, এবং যেখানে আমি কিছুটা সমস্যা দেখছি তা হ'ল কোড-অ্যাস-ডেটা পদ্ধতির। প্রকারের চেয়ে আরও বিমূর্ত স্তরে প্রকারগুলি বিদ্যমান। লিস্পের এই পার্থক্য নেই - সবকিছু কাঠামোর মধ্যে "সমতল"। যদি আমরা কিছু অভিব্যক্তি E: T (যেখানে টি এর ধরণের কিছু উপস্থাপনা) বিবেচনা করে, এবং তারপরে আমরা এই অভিব্যক্তিটিকে সরল ওল 'ডেটা হিসাবে বিবেচনা করি, তবে এখানে টি এর ধরণটি ঠিক কী? ভাল, এটা এক ধরনের! একটি ধরনের হ'ল একটি উচ্চতর, আদেশের ধরণ, সুতরাং আসুন আমরা এগিয়ে যাই এবং আমাদের কোডে সে সম্পর্কে কিছু বলি:

E : T :: K

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

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


কিউ শেন হওয়ার পরে পরবর্তী পুনরাবৃত্তিটি একই ব্যক্তির দ্বারা বিকশিত বলে মনে হচ্ছে ।
ডায়াগন

4

লিঙ্কটি মারা গেছে। তবে যে কোনও ক্ষেত্রে ডিলান স্থিতিশীলভাবে টাইপ করা হয় না।
বিজন লিন্ডকভিস্ট

@ বিজার্ন লিন্ডকভিস্ট: সেই লিঙ্কটি ডিলানের উপর ধীরে ধীরে টাইপিং যুক্ত করার একটি থিসিসের ছিল।
রেনার জোসভিগ

1
@ বিজার্ন লিন্ডকভিস্ট: আমি একটি ওভারভিউ পেপারের সাথে লিঙ্ক করেছি।
রেনার জোসভিগ

তবে ধীরে ধীরে টাইপিং স্ট্যাটিক টাইপিং হিসাবে গণনা করা হয় না। যদি এটি হয়, তবে পাইপিকে স্ট্যাটিকালি পাইথন টাইপ করা হবে কারণ এটি ধীরে ধীরে টাইপিংও ব্যবহার করে।
বিজন লিন্ডকভিস্ট

2
@ বিজার্ন লিন্ডকভিস্ট: যদি আমরা ধীরে ধীরে টাইপিংয়ের মাধ্যমে স্থিতিশীল প্রকারগুলি যুক্ত করি এবং সংকলনের সময় এগুলি পরীক্ষা করা হয়, তবে এটি স্থির টাইপিং। পুরো প্রোগ্রামটি স্ট্যাটিকালি টাইপ করা হয় তা নয়, অংশ / অঞ্চল। homes.sice.indiana.edu/jsiek/ কি-is - gradual - typing 'ধীরে ধীরে টাইপিং একটি টাইপ সিস্টেম যা আমি ২০০ Wal সালে ওয়ালিদ তাহার সাথে বিকাশ করেছি যা একটি প্রোগ্রামের অংশগুলিকে গতিশীলভাবে টাইপ করতে এবং অন্যান্য অংশগুলিকে স্ট্যাটিকভাবে টাইপ করার অনুমতি দেয়।'
রাইনার জোসভিগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.