নতুন অন্তর্নির্মিত অপারেটরগুলির সংজ্ঞা দেওয়া হচ্ছে
স্ট্যান্ডার্ড গল্ফস্ক্রিপ্ট ইন্টারপ্রেটারে খুব কমই ব্যবহৃত বৈশিষ্ট্য রয়েছে যা ডাবল কোটেড স্ট্রিং ইন্টারপোলটেড রুবি মঞ্জুরি দেয়।
এই বৈশিষ্ট্যটি বেশি ব্যবহৃত হয় না এমন একটি কারণ হ'ল, অদ্ভুতভাবে, সংযোজন সময়ে ইন্টারপোল্টেড কোডটি কার্যকর করা হয় এবং আউটপুটটি গল্ফস্ক্রিপ্ট ইন্টারপ্রেটার দ্বারা ক্যাশে করা হয় যাতে একই স্ট্রিং আক্ষরিক তার পরেও সর্বদা একই মান প্রদান করে স্ট্রিং eval।
যাইহোক, এই বৈশিষ্ট্যের জন্য একটি জিনিসটি ভাল হিসাবে দেখা যাচ্ছে তা হ'ল রুবি কোডে প্রয়োগ করা নতুন গল্ফস্ক্রিপ্ট অপারেটরগুলির সংজ্ঞা দেওয়া। উদাহরণস্বরূপ, এখানে একটি নতুন বাইনারি সংযোজন অপারেটরকে সংজ্ঞায়িত করা যায় যা স্ট্যান্ডার্ড অন্তর্নির্মিতের মতো কাজ করে+
অপারেটরের :
"#{var'add','gpush a+b'.cc2}";
আপনি নিজের কোডটিতে সংজ্ঞাটি কোথায় রেখেছেন তা সত্য নয়; রুবি কোড যুক্ত ডাবল-কোটযুক্ত স্ট্রিং পার্স হওয়ার সাথে সাথেই নতুন অপারেটর সংজ্ঞায়িত হয়ে যায়। add
অপারেটর কাজ উপরে বর্ণিত ঠিক বিল্ট-ইন মত+
অপারেটর, এবং ঠিক একই ভাবে ব্যবহার করা যেতে পারে:
1 2 add # evaluates to 3
"foo" "bar" add # evaluates to "foobar"
অবশ্যই, একটি নতুন সংযোজন অপারেটর সংজ্ঞায়িত করা বেশ অব্যর্থ, যদি না আপনি বিল্ট-ইন +
অপারেটরটি মুছার মতো নির্বোধ কিছু করেন । তবে আপনি একই কৌশলটি নতুন অপারেটরগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারেন যা কাজগুলি গল্ফস্ক্রিপ্টটি (সহজেই) স্থানীয়ভাবে করতে পারে না যেমন বলুন, অভিন্নভাবে অ্যারে বদলানো:
"#{var'shuf','gpush a.factory(a.val.shuffle)'.cc1}";
10,shuf # evaluates to 0,1,2,...,9 in random order
বা পুরো স্ট্যাকের বিষয়বস্তু মুদ্রণ:
"#{var'debug','puts Garray.new($stack).ginspect'.cc}";
4,) ["foo" debug # prints ["" [0 1 2] 3 "foo"], leaving the stack untouched
বা ইন্টারেক্টিভ ইনপুট:
"#{var'gets','gpush Gstring.new(STDIN.gets)'.cc}";
]; { "> " print gets ~ ]p 1 } do # simple GolfScript REPL
এমনকি ওয়েব অ্যাক্সেস:
"#{
require 'net/http'
require 'uri'
var'get','gpush Gstring.new(Net::HTTP.get_response(URI.parse(a.to_s)).body)'.cc1
}";
"http://example.com" get
অবশ্যই, পরবর্তীকালের কিছুটা গল্ফিয়ার (এবং ঝুঁকিপূর্ণ!) বাস্তবায়ন যেমন:
"#{var'get','gpush Gstring.new(`curl -s #{a}`)'.cc1}";
যদিও নিজের মধ্যে বিশেষভাবে গল্ফ নয়, বিল্ট-ইন কমান্ডগুলি সরবরাহ করে তা আপনাকে গল্ফস্ক্রিপ্টের সক্ষমতা বাড়িয়ে দেয়।
এটা কিভাবে কাজ করে?
এইভাবে নতুন গল্ফস্ক্রিপ্ট অপারেটরগুলি কীভাবে সংজ্ঞায়িত করা যায় সে সম্পর্কে অনুমোদনমূলক রেফারেন্স অবশ্যই দোভাষীর সোর্স কোড । এটি বলেছিল, এখানে কয়েকটি দ্রুত টিপস:
একটি নতুন অপারেটর সংজ্ঞায়িত করতে name
যা রুবি কোড চালায় code
, ব্যবহার করুন:
var'name','code'.cc
কোডের অভ্যন্তরে, gpop
স্ট্যাকের বাইরে একটি মান পড়তে এবং gpush
একটি পিছনে ঠেলাঠেলি করার জন্য ব্যবহার করুন You এছাড়াও আপনি সরাসরি অ্যারের মাধ্যমে স্ট্যাকটি অ্যাক্সেস করতে পারেন $stack
। উদাহরণস্বরূপ, উভয়কে ঠেলাঠেলি করে a
এবং b
স্ট্যাকের উপরে রাখার $stack<<a<<b
চেয়ে গল্ফিয়ার gpush a;gpush b
।
[
অ্যারে স্টার্ট মার্কারগুলির অবস্থানগুলি অ্যারেতে সংরক্ষণ করা হয় $lb
। gpop
ফাংশন তাদের অবস্থান স্ট্যাক পর্যন্ত সঙ্কুচিত নিচে হলে তা এই মার্কার সামঞ্জস্য কিন্তু সাধিত যত্ন নেয় $stack
সরাসরি অ্যারের না।
.cc
স্ট্রিং পদ্ধতি যে একটি GolfScript অপারেটর মধ্যে একটি স্ট্রিং রুবি কোড প্রনয়ন প্রায় শুধু একটি সুবিধার্থে মোড়কের হয় Gblock.new()
। এছাড়া রূপগুলো হয়েছে .cc1
, .cc2
এবং .cc3
যে অপারেটর স্বয়ংক্রিয়ভাবে স্ট্যাকের বন্ধ 1, 2 অথবা 3 আর্গুমেন্ট পপ এবং তাদের ভেরিয়েবল নির্ধারণ করা a
, b
এবং c
। এটির .order
মতো এমন একটি পদ্ধতি রয়েছে যা .cc2
এটি স্বয়ংক্রিয়ভাবে অগ্রাধিকার অনুসারে যুক্তি সাজায় ।
GolfScript স্ট্যাক সমস্ত মান (এবং হওয়া উচিত!) প্রকারের অবজেক্টের Gint
, Garray
, Gstring
বা Gblock
। অন্তর্নিহিত দেশীয় পূর্ণসংখ্যা বা অ্যারে, যেখানে প্রয়োজন হয়, .val
পদ্ধতিটির মাধ্যমে অ্যাক্সেস করা যায় ।
- তবে নোট করুন যে
Gstring.val
একটি অ্যারের ফেরত দেয় Gint
! Gstring
কোনও স্থানীয় রুবি স্ট্রিংয়ে রূপান্তর করতে .to_s
তার পরিবর্তে কল করুন (বা স্ট্রিং ইন্টারপোলেশনের মতো এটি স্বয়ংক্রিয়ভাবে এমন একটি প্রসঙ্গে ব্যবহার করুন)। যে .to_gs
কোনও জিএস মানকে কল করা এটি এটিকে পরিণত করে Gstring
, তাই কোনও জিএস মান দিয়ে স্ট্রিংফাই করা যায় .to_gs.to_s
।
gpush
ক্রিয়াটি সংশ্লিষ্ট জিএস ধরনের মধ্যে নেটিভ রুবি সংখ্যা, স্ট্রিং বা অ্যারে স্বয়ংক্রিয় মোড়ানো থাকে, স্পষ্টভাবে কলিং যেমন দ্বারা যাতে আপনি প্রায়ই এটা নিজেকে করতে হবেGstring.new()
। যদি আপনি জিএস মান ধরণের একের বাইরে অন্য কোনও কিছু স্ট্যাকের দিকে ঠেলে থাকেন তবে পরে যে কোনও কোড যা এটিকে চালিত করার চেষ্টা করে তা ক্রাশ হওয়ার সম্ভাবনা রয়েছে।
জিএস মান .factory
ধরণেরও এমন একটি পদ্ধতি রয়েছে যা টাইপের কনস্ট্রাক্টরকে কল করে, যা দরকারী বিষয়গুলি উদাহরণস্বরূপ তাদের অ্যারে / স্ট্রিংগুলি পুনর্নির্মাণের জন্য তাদের সামগ্রীগুলি পুনঃনির্মাণের জন্য ব্যবহার করতে পারে। সব ধরনের আরো একটি আছে .coerce
পদ্ধতি যা সঞ্চালিত জাভাস্ক্রিপ্টের এই মাতব্বরী : a.coerce(b)
ধারণকারী একজোড়া ফেরৎ a
এবং b
একই ধরনের করতে বাধ্য।
... x
মধ্যে... [x]
? আমি দেখতে পাচ্ছি সেরা[.;]
।