জুলিয়ায় একটি "প্রতীক" কী?


131

বিশেষত: আমি জুলিয়ার ডেটাফ্রেমস প্যাকেজটি ব্যবহার করার চেষ্টা করছি, বিশেষ করে নামগুলি বিকল্পের সাথে পাঠ্যযোগ্য () ফাংশন, তবে এর জন্য প্রতীকগুলির একটি ভেক্টর প্রয়োজন।

  • প্রতীক কি?
  • তারা কেন স্ট্রিং একটি ভেক্টর উপর এটি চয়ন করবে?

এখনও অবধি আমি জুলিয়া ভাষায় প্রতীক শব্দের কয়েকটি মুখ্য রেফারেন্স পেয়েছি। দেখে মনে হচ্ছে প্রতীকগুলি ": var" দ্বারা প্রতিনিধিত্ব করা হয়েছে তবে সেগুলি কী তা আমার কাছে পরিষ্কার from

পাশে: আমি চালাতে পারি

df = readtable( "table.txt", names = [symbol("var1"), symbol("var2")] )

আমার দুটি বুলেটযুক্ত প্রশ্ন এখনও দাঁড়িয়ে আছে।


3
এই বিষয় সম্পর্কে কিছু কথোপকথন এখানে পাওয়া যাবে: গ্রুপ. google.com/d/msg/julia-users/MS7KW8IU-0o/cQ-yDOs_CQEJ
jverzani

উত্তর:


231

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

সুতরাং একটি প্রতীক আসলে কি? উত্তরটি জুলিয়া এবং লিস্পের মিলের মধ্যে রয়েছে - ভাষার কোডটি ভাষাতে একটি ডেটা কাঠামো হিসাবে উপস্থাপন করার ক্ষমতা। কিছু লোক এটিকে "হোমোসোনিসিটি" ( উইকিপিডিয়া ) বলে, তবে অন্যরা মনে হয় না যে ভাষা একমাত্র হোমোকোনিক হওয়ার পক্ষে যথেষ্ট। তবে পরিভাষাটি আসলেই কিছু যায় আসে না। মুল বক্তব্যটি হ'ল যখন কোনও ভাষা তার নিজস্ব কোড উপস্থাপন করতে পারে, তার জন্য অ্যাসাইনমেন্ট, ফাংশন কল, আক্ষরিক মান হিসাবে লেখা যেতে পারে এমন জিনিসগুলির মতো প্রতিনিধিত্ব করার একটি উপায় প্রয়োজন। এটির নিজস্ব ভেরিয়েবলগুলি উপস্থাপন করারও একটি উপায় প্রয়োজন। অর্থাৎ, আপনাকে উপাত্ত হিসাবে উপস্থাপনের একটি উপায় প্রয়োজন - এটির 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পরিবর্তে এটি অ্যাক্সেস করতে সক্ষম হতে পারেন । যখন এটি সম্ভব হয়ে যায়, কেবলমাত্র কলামগুলির নামগুলি বৈধ শনাক্তকারী যারা এই সুবিধাজনক বাক্য গঠন সহ অ্যাক্সেসযোগ্য।

আরো দেখুন:


6
ইন্টার্নিং: কম্পিউটার বিজ্ঞানে স্ট্রিং ইন্টার্নিং হ'ল প্রতিটি স্বতন্ত্র স্ট্রিং মানের কেবল একটি অনুলিপি সংরক্ষণের একটি পদ্ধতি, যা অবশ্যই পরিবর্তনযোগ্য হতে হবে। ইন্টার্নিং স্ট্রিংগুলি কিছু স্ট্রিং প্রসেসিংয়ের কাজগুলিকে আরও বেশি সময় দেয় - বা স্ট্রিংটি তৈরি করা বা ইন্টার্ন করা হলে আরও সময় প্রয়োজন হয় এমন স্থানের জন্য দক্ষ। en.wikipedia.org/wiki/String_interning
xiaodai

এক পর্যায়ে আপনি লিখুন eval(:foo)এবং অন্যদিকে eval(sym)। তার মাঝে একটি অর্থপূর্ণ পার্থক্য আছে কি eval(:foo)এবং eval(foo)?
গ্রেস্কেল

খুব বেশি: eval(:foo)ভেরিয়েবল fooএমন মান দেয় যেখানে eval(foo)কলগুলি সেই মানটির সাথে আবদ্ধ হয়। লিখন eval(:foo)শুধু সমতূল্য foo(গ্লোবাল সুযোগ) যাতে eval(foo)ভালো হয় eval(eval(:foo))
স্টেফানকার্পিনস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.