জুলিয়ার প্রতীকগুলি লিস্প, স্কিম বা রুবির মতোই। যাইহোক, এই সম্পর্কিত প্রশ্নগুলির উত্তরগুলি আমার মতে সত্যই সন্তোষজনক নয় । যদি আপনি এই উত্তরগুলি পড়ে থাকেন তবে মনে হয় যে চিহ্নটি একটি স্ট্রিংয়ের চেয়ে পৃথক হওয়ার কারণটি হল স্ট্রিংগুলি পরিবর্তনযোগ্য এবং প্রতীকগুলি অপরিবর্তনীয় এবং প্রতীকগুলি "অভ্যন্তরীণ "ও রয়েছে - যার অর্থ যা বোঝায়। স্ট্রিংগুলি রুবি এবং লিস্পে পরিবর্তনীয় হতে পারে তবে তারা জুলিয়ায় নয়, এবং এই পার্থক্যটি আসলে একটি লাল রঙের হেরিং। প্রতীকগুলি অন্তর্ভুক্ত করা হয়েছে - অর্থাত্ দ্রুত সাম্যের তুলনার জন্য ভাষা প্রয়োগের ফলে - এটিও অপ্রাসঙ্গিক বাস্তবায়ন বিশদ। আপনার এমন একটি বাস্তবায়ন থাকতে পারে যা অভ্যন্তরীন প্রতীকগুলি না করে এবং ভাষাটি একই রকম হয়।
সুতরাং একটি প্রতীক আসলে কি? উত্তরটি জুলিয়া এবং লিস্পের মিলের মধ্যে রয়েছে - ভাষার কোডটি ভাষাতে একটি ডেটা কাঠামো হিসাবে উপস্থাপন করার ক্ষমতা। কিছু লোক এটিকে "হোমোসোনিসিটি" ( উইকিপিডিয়া ) বলে, তবে অন্যরা মনে হয় না যে ভাষা একমাত্র হোমোকোনিক হওয়ার পক্ষে যথেষ্ট। তবে পরিভাষাটি আসলেই কিছু যায় আসে না। মুল বক্তব্যটি হ'ল যখন কোনও ভাষা তার নিজস্ব কোড উপস্থাপন করতে পারে, তার জন্য অ্যাসাইনমেন্ট, ফাংশন কল, আক্ষরিক মান হিসাবে লেখা যেতে পারে এমন জিনিসগুলির মতো প্রতিনিধিত্ব করার একটি উপায় প্রয়োজন। এটির নিজস্ব ভেরিয়েবলগুলি উপস্থাপন করারও একটি উপায় প্রয়োজন। অর্থাৎ, আপনাকে উপাত্ত হিসাবে উপস্থাপনের একটি উপায় প্রয়োজন - এটির foo
বাম পাশে থাকা ডেটা হিসাবে :
foo == "foo"
এখন আমরা বিষয়টির হৃদয়ে পৌঁছে যাচ্ছি: একটি চিহ্ন এবং একটি স্ট্রিংয়ের মধ্যে পার্থক্য হ'ল foo
তুলনার বাম দিকে এবং "foo"
ডান হাতের পার্থক্য। বাম দিকে, foo
একটি শনাক্তকারী এবং এটি foo
বর্তমান স্কোপে ভেরিয়েবলের সাথে আবদ্ধ মানটির মূল্যায়ন করে । ডানদিকে, "foo"
একটি স্ট্রিং আক্ষরিক এবং এটি স্ট্রিং মান "foo" এর মূল্যায়ন করে। লিস্প এবং জুলিয়া উভয়েরই একটি প্রতীক হ'ল আপনি কীভাবে ডেটা হিসাবে চলককে উপস্থাপন করেন। একটি স্ট্রিং কেবল নিজেকে উপস্থাপন করে। আপনি eval
তাদের প্রয়োগ করে পার্থক্যটি দেখতে পারেন :
julia> eval(:foo)
ERROR: foo not defined
julia> foo = "hello"
"hello"
julia> eval(:foo)
"hello"
julia> eval("foo")
"foo"
প্রতীক যা :foo
মূল্যায়ন করে তার উপর নির্ভর করে - কিছু যদি - ভেরিয়েবলের foo
সাথে আবদ্ধ হয় তবে "foo"
সর্বদা কেবল "foo" এর মূল্যায়ন করে। আপনি যদি জুলিয়ায় এমন ভেরিয়েবলগুলি ব্যবহার করতে চান যা ভেরিয়েবল ব্যবহার করে, তবে আপনি প্রতীকগুলি ব্যবহার করছেন (আপনি এটি জানেন বা না জানেন)। উদাহরণ স্বরূপ:
julia> ex = :(foo = "bar")
:(foo = "bar")
julia> dump(ex)
Expr
head: Symbol =
args: Array{Any}((2,))
1: Symbol foo
2: String "bar"
typ: Any
যা অন্যান্য জিনিসগুলির মধ্যে স্টাফগুলি ফেলে দেয় তা হ'ল :foo
কোডটি উদ্ধৃত করে আপনি যে অভিব্যক্তি অবজেক্টটি পেয়েছেন তার ভিতরে একটি প্রতীক বস্তু রয়েছে foo = "bar"
। এখানে আরও একটি উদাহরণ দেওয়া যায়, :foo
ভেরিয়েবলটিতে সজ্জিত চিহ্ন সহ একটি অভিব্যক্তি তৈরি করা sym
:
julia> sym = :foo
:foo
julia> eval(sym)
"hello"
julia> ex = :($sym = "bar"; 1 + 2)
:(begin
foo = "bar"
1 + 2
end)
julia> eval(ex)
3
julia> foo
"bar"
যখন আপনি এই কাজ করতে চেষ্টা করুন sym
স্ট্রিং আবদ্ধ হয় "foo"
, এটা কাজ করবে না:
julia> sym = "foo"
"foo"
julia> ex = :($sym = "bar"; 1 + 2)
:(begin
"foo" = "bar"
1 + 2
end)
julia> eval(ex)
ERROR: syntax: invalid assignment location ""foo""
এটি কেন কাজ করবে না তা দেখতে বেশ স্পষ্ট - আপনি যদি "foo" = "bar"
হাতের সাহায্যে চেষ্টা করার চেষ্টা করেন , এটিও কাজ করবে না।
এটি প্রতীকটির মূল অংশ: একটি প্রতীকটি রূপকগুলিতে পরিবর্তনের প্রতিনিধিত্ব করতে ব্যবহৃত হয়। একবার আপনার কাছে ডেটা প্রকার হিসাবে চিহ্নগুলি উপস্থিত থাকলে অবশ্যই এটি হ্যাশ কীগুলির মতো অন্যান্য জিনিসের জন্য ব্যবহার করার লোভজনক হয়ে ওঠে। তবে এটি একটি প্রাসঙ্গিক, সুবিধাবাদী ডেটা ধরণের ব্যবহার যা এর অন্য প্রাথমিক উদ্দেশ্য।
নোট করুন আমি কিছুক্ষণ আগে রুবির কথা বলা বন্ধ করে দিয়েছিলাম। এটি কারণ রুবি হোমোমিকোনিক নয়: রুবি তার অর্থ প্রকাশ করে রুবি অবজেক্ট হিসাবে। সুতরাং রুবির প্রতীক প্রকারটি এক ধরণের অনুসন্ধানমূলক অঙ্গ - একটি অবশিষ্টাংশের অভিযোজন, লিস্পের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, তবে এটি আর তার আসল উদ্দেশ্যে ব্যবহৃত হয় না। রুবি সিম্বলগুলি অন্য উদ্দেশ্যে - হ্যাশ কী হিসাবে, পদ্ধতির টেবিলের বাইরে পদ্ধতিগুলি টানতে বেছে নেওয়া হয়েছে - তবে রুবিতে চিহ্নগুলি ভেরিয়েবলগুলি উপস্থাপন করতে ব্যবহৃত হয় না।
স্ট্রিংয়ের চেয়ে ডেটাফ্রেমে চিহ্নগুলি কেন ব্যবহার করা হয়, এটি কারণ এটি ব্যবহারকারীর সরবরাহিত এক্সপ্রেশনগুলির অভ্যন্তরের ভেরিয়েবলগুলিতে কলাম মানগুলিকে আবদ্ধ করার জন্য ডেটাফ্রেমে একটি সাধারণ প্যাটার্ন। সুতরাং কলামের নামগুলি প্রতীক হওয়া স্বাভাবিক, যেহেতু চিহ্নগুলি হ'ল ডেটা হিসাবে ভেরিয়েবল উপস্থাপন করতে আপনি যা ব্যবহার করেন। বর্তমানে, কলামটি df[:foo]
অ্যাক্সেস করতে আপনাকে লিখতে হবে foo
, তবে ভবিষ্যতে আপনি df.foo
পরিবর্তে এটি অ্যাক্সেস করতে সক্ষম হতে পারেন । যখন এটি সম্ভব হয়ে যায়, কেবলমাত্র কলামগুলির নামগুলি বৈধ শনাক্তকারী যারা এই সুবিধাজনক বাক্য গঠন সহ অ্যাক্সেসযোগ্য।
আরো দেখুন: