এই প্রোগ্রামটি বৈধ কেন? আমি একটি সিনট্যাক্স ত্রুটি তৈরি করার চেষ্টা করছিলাম


489

আমি ActiveState এর 32 বিট চলমান করছি ActivePerl 5.14.2 উইন্ডোজ 7 আমি গীত নিয়ে জগাখিচুড়ি চেয়েছিলেন সনাক্ত করতে প্রোগ্রাম সিনট্যাক্স ত্রুটি দিয়ে পরীক্ষা করা হচ্ছে প্রাক কমিট হুক। (কোনওরকমভাবে আমি ঠিক এইরকম খারাপ প্রতিশ্রুতিটি সম্পাদন করতে পেরেছি)) সুতরাং পরীক্ষার প্রোগ্রাম হিসাবে আমি এলোমেলোভাবে এটিকে জোট করেছি:

use strict;
use warnings;

Syntax error!

exit 0;

যাইহোক, এটি কোনও সংকেত ছাড়াই সংকলন এবং সম্পাদন করে এবং প্রস্থান করার সময় ত্রুটিযুক্ত শূন্য হয়। এই বৈধ সিনট্যাক্সটি কেমন?


121
আপনি কি কেবল প্রমাণ করেছেন যে পার্লে এলোমেলো শব্দ টাইপ করার ফলে কর্মসূচী তৈরি হয় ??!?!?!?!
পিটার এম

10
@ পিটারএম খুব কমই এলোমেলো শব্দ। আমি প্রমাণ করেছি পার্ল সিনট্যাক্স সম্পর্কে আমি যথেষ্ট জানি না। এখন আমি আরও কিছু জানি।
বিল রুপার্ট

10
আপনি সম্ভবত no indirectসেগুলি হওয়া থেকে বিরত করতে চান
লিওনার্ড

@ লিওনার্ড টিপটির জন্য ধন্যবাদ!
বিল রুপার্ট

1
এটি এখন পর্যন্ত সবচেয়ে বিখ্যাত পার্ল প্রশ্ন। শোয়ার্জের স্নিপেট হিসাবে আরও ভাল :whatever / 25 ; # / ; die "this dies!";
জেএম 666

উত্তর:


540

পার্লের একটি সিনট্যাক্স রয়েছে যার নাম "পরোক্ষ পদ্ধতি নোটেশন"। এটা করতে পারবেন

Foo->new($bar)

হিসাবে লিখতে হবে

new Foo $bar

সুতরাং যে মানে

Syntax error ! exit 0;

হিসাবে একই

error->Syntax(! exit 0);

অথবা

error->Syntax(!exit(0));

এটি কেবল বৈধ সিনট্যাক্সই নয়, এটি রান-টাইম ত্রুটির ফল দেয় না কারণ প্রথমটি কার্যকর করা হয় exit(0)


1
@ হাসান, কেন? এটি একটি অভিব্যক্তি দ্বারা অনুসরণ করা হয়।
ইকেগামি

3
আমি এটি "সিনট্যাক্স ত্রুটি! প্রস্থান 0;" হিসাবে যতটা পঠন করি ততক্ষণ পেয়েছি, কিন্তু আমি অপ্রত্যক্ষ আহ্বান সম্পর্কে ভাবি নি। ভুলে গিয়ে অনেক সময়!
বিল রুপার্ট

6
@ হাসান, এটিকে এভাবে ভাবুন, যেহেতু টাইপ করা হয় না তার !exit(0)চেয়ে আর কোনও ধরণের ত্রুটি হতে পারে !$xনা।
ইকেগামী

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

6
@ নাওয়াজ, এটি আসলে বেশ জনপ্রিয়। এটা প্রত্যেকের যে জাভা এবং সি ++ মধ্যে নির্মান বস্তু, এবং পার্ল প্রোগ্রামার ব্যবহার সম্পর্কে একটি বৃহৎ শরীরের দ্বারা ব্যবহৃত হচ্ছে new Classএবং print $fh ...পরিবর্তে Class->new(...)এবং $fh->print(...)। আমি আপনাকে
জানাব

112

কেন জানি না, তবে পার্ল এটিই তৈরি করে:

perl -MO=Deparse -w yuck
BEGIN { $^W = 1; }
use warnings;
use strict 'refs';
'error'->Syntax(!exit(0));
yuck syntax OK

দেখে মনে হচ্ছে যে এই পার্সার মনে করে আপনি পদ্ধতিটি কল Syntaxকরে errorগেছেন ... অবাক করা সত্যই!


3
এটি পরোক্ষ পদ্ধতি কল সিনট্যাক্স। এটি এখানে (সাজানোর) কারণ exit(0)এটির ফলাফলটি পাস করার চেষ্টা করার আগে প্রোগ্রামটি প্রস্থান করার আগে প্রথমে মূল্যায়ন করা হয় 'error'->Syntax()
ডাস্কউফ -অ্যাক্টিভ-

6
পার্ল "অপ্রত্যক্ষ (অবজেক্ট) সিনট্যাক্স" ধরে নিয়েছে বলে মনে হয়, সাধারণত new Classপরিবর্তে এর মতো ব্যবহৃত হয় Class->new()। পদ্ধতিটি কল করতে Syntax, exitফাংশনটি কার্যকর করা হয়, তাই রান-টাইম ত্রুটি কখনই ঘটে না।
আমন

118
অভিনন্দন। আপনি একটি প্রোগ্রাম পেয়েছেন যেখানে আপনাকে একটি অর্ধ-কোলন যুক্ত করতে হবে যাতে সংকলনটি ব্যর্থ হয়।
ভিড়

use strict; use warnings; error->Syntax(! print "hi"); ফলন: সিনট্যাক্স ঠিক আছে পার্ল-এমও = ডিপার্সেও, তবে use warningsএটির সাথে সম্ভবত কিছু বলা উচিত কারণ এটি বোঝা যায় যে এটি লোড হচ্ছে না। পরিবর্তে এটি একটি রানটাইম ত্রুটি ছুড়ে "" অবজেক্ট পদ্ধতিটি সনাক্ত করতে পারে না ""

53

আপনি ত্রুটি না পেয়ে যাওয়ার কারণটি হ'ল প্রথম সম্পাদিত কোড

exit(0);

কারণ আপনার প্রথম লাইনে একটি সেমিকোলন ছিল না:

Syntax error!

সংকলকটি অনুমান করবে (ভুলভাবে) যে এটি notঅপারেটর !দিয়ে exit(0)ফেলেছে তার সাথে সাব্রোটিন কল It সুতরাং আর কোনও রানটাইম ত্রুটির খবর পাওয়া যায় না।

আপনি খেয়াল করবেন যে আপনি যদি exit(0)এমন কিছু পরিবর্তন করেন তবে আপনি print "Hello world!"ত্রুটি পান:

Can't locate object method "Syntax" via package "error" ...

এবং আপনার ত্রুটি স্তর সেট করা হবে:

> echo %errorlevel%
255

7
>The compiler will guess (incorrectly) সংকলক ভুলভাবে কিছু করতে পারে না।
লিয়াম ল্যাভার্টি

14
@ লিয়ামলভার্টি হ্যাঁ, এটি পারে। এটি মানুষের কী বোঝাতে চেয়েছিল তা ভুল অনুমান করতে পারে।
টিএলপি

4
সমীকরণে মানবটি ভুল। সংকলকটি কেবল "সঠিক" বা "ভাঙ্গা" হতে পারে। এটি ভাষার সংজ্ঞা বা ব্যবহারকারীর অভিপ্রায় সম্পর্কে মতামত পায় না।
লিয়াম ল্যাভার্টি

4
@ লিয়ামল্যাভার্টি যদি এটির ক্ষেত্রে ব্যবহারকারীর উদ্দেশ্য অনুমান করতে পারে তবে এটি একটি সুন্দর ঝরঝরে সংকলক হবে yes সুতরাং, সংকলক সঠিকভাবে অনুমান করতে পারে না। আপনি আমার বক্তব্যটির কিছু প্রযুক্তিগত জারগন বিশ্লেষণ করছেন, যা আমি যুক্ত করতে পারি এটি পড়ার ভুল উপায়।
টিএলপি

এটি কি ব্যাখ্যাকারী নয়? ;-)
রিককি

33

উপরে উল্লিখিত হিসাবে এটি পরোক্ষ পদ্ধতি কলিং স্বরলিপি দ্বারা সৃষ্ট। আপনি এই সম্পর্কে সতর্ক করতে পারেন:

use strict;
use warnings;
no indirect;

Syntax error!

exit 0;

উত্পাদন:

Indirect call of method "Syntax" on object "error" at - line 5.

এটির জন্য অপ্রত্যক্ষ CPAN মডিউল প্রয়োজন

আপনি no indirect "fatal";প্রোগ্রামটি মরতেও ব্যবহার করতে পারেন (এটি আমি করি)


8

পার্ল 6 চেষ্টা করুন , আপনার প্রত্যাশাগুলি আরও সহজেই পূর্ণ হবে বলে মনে হচ্ছে:

===SORRY!=== Error while compiling synerror.p6
Negation metaoperator not followed by valid infix
at synerror.p6:1
------> Syntax error!⏏<EOL>
    expecting any of:
        infix
        infix stopper

1

এই গবেষণাপত্রে , আমরা প্রোগ্রামিং ভাষাগুলি সম্প্রদায়ের একটি দীর্ঘ-স্থায়ী উন্মুক্ত সমস্যার উত্তর দেওয়ার লক্ষ্য নিয়েছি: বৈধ পার্ল তৈরি না করে প্রাচীরের পেইন্টটি রঙ করা কি সম্ভব?

TLDR; কষ্টসহকারে


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