";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))
উদ্ধৃত সংস্করণ: কোডিংগ্রাউন্ডে এটি ব্যবহার করে দেখুন।
উদ্ধৃত সংস্করণ: কোডিংগ্রাউন্ডে এটি ব্যবহার করে দেখুন।
দ্রষ্টব্য যে আউটপুটটি এরকম কিছু দেখাচ্ছে
> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit
কারণ কোডটি ঘোষণাপত্রের মাধ্যমে ঘোষণাপত্রটি ব্যাখ্যা করা হয় (প্রতিটি ;একটি ঘোষণার সমাপ্ত হয়) এবং প্রতিটি ঘোষণার মান এবং প্রকার দেখায়।
পটভূমি
এসএমএলে ফর্মের একটি রাইন রয়েছে <code>"<code in quotes>":
str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))"
এবং ফর্ম একটি "<code in quotes>"<code>:
";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)
উভয়ই এই সত্যের উপর নির্ভর করে যে- <code>পার্টটিতে কোনও উদ্ধৃতি নেই এবং তাই কোনও কিছুর পালানোর প্রয়োজনের সাথে উদ্ধৃতি "দেওয়া যেতে পারে, কোয়েনটিকে আউটপুট দেওয়ার প্রয়োজনীয়তা দ্বারা সরবরাহ করা হয়str(chr 34) ।
itকোনও বিবৃতিতে যখন কোনও স্পষ্টত শনাক্তকারী দেওয়া না হয় তখন এগুলি অন্তর্নিহিত শনাক্তকারীকে খুব ভারী নির্ভর করে ।
প্রথম quine সালে str(chr 34);বেঁধে itধারণকারী স্ট্রিং ", fn x=>শুরু হয় একটি বেনামী ফাংশন একটি আর্গুমেন্ট গ্রহণ xযোগসূত্র তারপর, x^it^x^itএবং তার ফলে স্ট্রিং ছাপে। এই বেনামে ফাংশনটি সরাসরি প্রোগ্রাম কোডযুক্ত একটি স্ট্রিংয়ে প্রয়োগ করা হয়, সুতরাং উপসংহার x^it^x^itফলন হয় <code>"<code>"।
দ্বিতীয় কুইনটি কেবল প্রোগ্রাম কোড দিয়ে স্ট্রিং হিসাবে শুরু হয় ";str(chr 34)^it;print(it^it)";যা আবদ্ধ it। তারপরে str(chr 34)^it;স্ট্রিংয়ের শুরুতে একটি উদ্ধৃতিটি উপস্থাপন করে এবং পুনরায় কোনও স্পষ্টত শনাক্তকারী দেওয়া হয় না, ফলস্বরূপ স্ট্রিংটি "<code>আবদ্ধ it। পরিশেষে print(it^it)স্ট্রিংটি নিজেই ফলন দেয় "<code>"<code>যা পরে মুদ্রিত হয় conc
ব্যাখ্যা
সম্পাদনা করুন: 108-বাইট সংস্করণটি আর আপ টু ডেট নেই, তবে এই ব্যাখ্যাটি পড়ার পরে কেউ এটিকে বুঝতে পারে।
উদ্ধৃতি-সুরক্ষিত কুইন উপরের উভয় পদ্ধতির সাথে একত্রিত হয় এবং এটিই ফর্মের "<code>"<code>। এটিকে আবার উদ্ধৃতি ""<code>"<code>"প্রদানের ফলন হিসাবে দেওয়া , সুতরাং আমরা একটি খালি স্ট্রিং এবং তারপরে অন্য ফর্মের একটি কুইন পাই।
তার মানে প্রোগ্রামটি হয় হয় "<code>শনাক্তকারী দ্বারা ফর্মটিতে তার নিজস্ব উত্স দেওয়া হয় it, বা itন্যায়সঙ্গত "এবং আমাদের <code>যুক্তি হিসাবে আমাদের নিজস্ব উত্স দেওয়া হয় এবং এইভাবে এই জাতীয় যুক্তি পরিচালনা করে এমন একটি ফাংশন হতে হবে।
(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))
আমরা কোন ক্ষেত্রে রয়েছি তা সনাক্ত করতে, আমরা যাচাই করি যা আকারের আকার 1 এর itচেয়ে বড় কিনা তা যদি না itহয় "এবং আমরা দ্বিতীয় ক্ষেত্রে থাকি, সুতরাং elseপার্টটি একটি বেনাম ফাংশন দেয় fn x=>print(it^it^x^it^x^it)যা পরে বলা হয় কারণ এটি উত্সটি স্ট্রিং হিসাবে অনুসরণ করে । it^it^প্রোগ্রামটির শুরুতে খালি স্ট্রিংয়ের জন্য প্রয়োজনীয় নেতৃস্থানীয়টি নোট করুন ।
যদি size it1 এর চেয়ে বড় হয় আমরা- thenপার্টে থাকি এবং ঠিক পারফর্ম করি print(it^it), তাই না? পুরোপুরি নয়, কারণ আমি আপনাকে অবহেলা করেছি যে এসএমএল দৃ strongly়ভাবে টাইপ করা হয়েছে যার অর্থ একটি শর্তসাপেক্ষে if <cond> then <exp_1> else <exp_2>সবসময় একই ধরণের থাকতে হবে যার অর্থ আবারও বোঝা যায় <exp_1>এবং <exp_2>একই ধরণের হওয়া দরকার। আমরা ইতিমধ্যে elseঅংশটির প্রকারটি জানি : একটি বেনামে ফাংশন যা একটি স্ট্রিং নেয় এবং তারপরে কলগুলি printটাইপ করে string -> <return type of print>এবং printটাইপ থাকে string -> unit( unitঅন্য উপায়ে একইভাবে হয় void), ফলে ফলাফলটি আবার হয় string -> unit।
তাই আপনি যদি thenঅংশ ছিল মাত্র print(it^it)কোন ধরনের হয়েছে unit, আমরা একটি টাইপ মেলেনি ত্রুটি পেতে হবে। তাহলে কেমন fn _=>print(it^it)? ( _ব্যবহৃত হয় না এমন একটি আর্গুমেন্টের জন্য ওয়াইল্ডকার্ড) নিজস্ব বেনামে এই ফাংশনটিতে টাইপ রয়েছে 'a -> unitযেখানে 'aএকটি স্বেচ্ছাচারিতা টাইপ থাকে তাই আমাদের শর্তসাপেক্ষিক প্রেক্ষাপটে যা কোনও string -> unitপ্রকার প্রয়োগ করে এটি কাজ করবে। (প্রকারের সাথে ভেরিয়েবলটি 'aতাত্ক্ষণিকভাবে প্রবর্তিত stringহয় this) তবে, এই ক্ষেত্রে আমরা কোনও কিছুই প্রিন্ট করব না কারণ নামহীন ফাংশনটি কখনই বলা হয় না! মনে রাখবেন, আমরা যখন- thenপার্টে যাই তখন সামগ্রিক কোড হয় "<code>"<code>, সুতরাং- <code>পার্ট কোনও ফাংশনকে মূল্যায়ন করে তবে এর পরে কিছুই আসে না, এটি কল হয় না।
এর পরিবর্তে আমরা একটি sequentialisation যা ফর্ম আছে ব্যবহার (<exp_1>; ...; <exp_n>)যেখানে <exp_1>থেকে <exp_n-1>নির্বিচারে ধরনের এবং প্রকার থাকা পারে <exp_n>পুরো sequentialisation ধরণ প্রদান করে। দেখুন মূল্যবোধের কার্মিক বিন্দু থেকে <exp_1>থেকে <exp_n-1>কেবল বাতিল করা হয়, তবে SML এছাড়াও অনুজ্ঞাসূচক নির্মান সমর্থন করে, যাতে এক্সপ্রেশন পার্শ্ব প্রতিক্রিয়া হতে পারে। সংক্ষেপে, আমরা পার্ট (print(it^it);print)হিসাবে গ্রহণ করি then, এইভাবে প্রথমে মুদ্রণ এবং তারপরে printসঠিক টাইপযুক্ত ফাংশনটি ফিরিয়ে আনব ।