এই কমান্ড হাই যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।
কার্যক্রম:
NAME এর
হাই - হাই ডকুমেন্টেশন [ছবি: হাই] [ছবি]
চেষ্টা Hy https://try-hy.appspot.com
PyPI https://pypi.python.org/pypi/hy
উৎস https://github.com/hylang/hy
তালিকা হাইলাং-আলোচনা
আইআরসি #হাই ফ্রিনোডে
নির্মাণ করা অবস্থা
ট্রাভিস CI.UNINDENT
Hy হল লিস্পের একটি চমৎকার উপভাষা যা পাইথনে এম্বেড করা আছে।
যেহেতু Hy তার লিস্প কোডকে পাইথন অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রিতে রূপান্তরিত করে, আপনার আছে
পাইথনের পুরো সুন্দর পৃথিবী আপনার নখদর্পণে, লিস্প আকারে!
সূচিপত্র:
দ্রুত শুরু
[ছবি: কারেন রাস্টার্ডের আলিঙ্গন] [ছবি]
(কডলসের জন্য কারেন রুস্তাদকে ধন্যবাদ!)
কেমন প্রতি পাওয়া HY আসল দ্রুত:
1। একটা তৈরি কর ভার্চুয়াল পাইথন পরিবেশ.
2. আপনার ভার্চুয়াল পাইথন পরিবেশ সক্রিয় করুন।
3. ইনস্টল করুন hy থেকে PyPI সঙ্গে বীচি ইনস্টল hy.
4. এর সাথে একটি REPL শুরু করুন hy.
5. REPL-এ স্টাফ টাইপ করুন:
=> ("হাই!" প্রিন্ট করুন)
হাই!
=> (defn salutationsnm [name] (মুদ্রণ (+ "Hy " name"!")))
=> (অভিবাদন "আপনার নাম")
হাই তোমার নাম!
ইত্যাদি
6. হয়ে গেলে CTRL-D টিপুন।
হে ভগবান! এটা আশ্চর্যজনক! I প্রয়োজন থেকে লেখা a Hy প্রোগ্রাম.
7. একটি অভিজাত প্রোগ্রামিং সম্পাদক খুলুন এবং টাইপ করুন:
(প্রিন্ট "আমি পাইথন সিনট্যাক্সে কোড করতে যাচ্ছিলাম, কিন্তু তারপর আমি হাই পেয়েছি।")
8. হিসাবে সংরক্ষণ করুন awesome.hy.
9. এবং আপনার প্রথম Hy প্রোগ্রাম চালান:
hy awesome.hy
10.
একটি গভীর শ্বাস নিন যাতে হাইপারভেন্টিলেট না হয়।
11.
খলনায়কভাবে হাসুন এবং আপনার হাইডওয়েতে লুকিয়ে যান এবং অকথ্য জিনিসগুলি করুন।
টিউটোরিয়াল
হাই টিউটোরিয়ালে স্বাগতম!
সংক্ষেপে, Hy হল একটি Lisp উপভাষা, কিন্তু যেটি এর গঠনকে পাইথনে রূপান্তরিত করে...
আক্ষরিক অর্থে পাইথনের বিমূর্ত সিনট্যাক্স ট্রিতে রূপান্তর! (অথবা এটি আরো অশোধিত রাখা
শর্তাবলী, Hy is lisp-stick on a Python!)
এটি বেশ সুন্দর কারণ এর মানে Hy বেশ কিছু জিনিস:
একটি লিস্প যা খুব পাইথনিক মনে হয়
লিস্পারদের জন্য, লিস্পের উন্মাদ শক্তি ব্যবহার করার একটি দুর্দান্ত উপায় কিন্তু পাইথনের বিস্তৃত বিশ্বে
লাইব্রেরি (কেন হ্যাঁ, আপনি এখন লিস্পে একটি জ্যাঙ্গো অ্যাপ্লিকেশন লিখতে পারেন!)
পাইথনিস্তাদের জন্য, পাইথনের আরাম থেকে লিস্প অন্বেষণ শুরু করার একটি দুর্দান্ত উপায়!
· প্রত্যেকের জন্য: একটি মনোরম ভাষা যাতে অনেক সুন্দর ধারণা রয়েছে!
মৌলিক ইন্ট্রো থেকে পাতার মর্মর উন্নত পাইথনিস্টাস
ঠিক আছে, হয়তো আপনি আগে কখনো Lisp ব্যবহার করেননি, কিন্তু আপনি Python ব্যবহার করেছেন!
Hy তে একটি "হ্যালো ওয়ার্ল্ড" প্রোগ্রাম আসলে খুব সহজ। চল এটা চেষ্টা করি:
("হ্যালো ওয়ার্ল্ড" মুদ্রণ)
দেখা? সহজ ! আপনি অনুমান করতে পারেন, এটি পাইথন সংস্করণের মতই:
প্রিন্ট "হ্যালো ওয়ার্ল্ড"
কিছু অতি সাধারণ গণিত যোগ করতে, আমরা করতে পারি:
(+ 1 3)
যা 4 ফেরত দেবে এবং এর সমতুল্য হবে:
1 + 3
আপনি কি লক্ষ্য করবেন তালিকার প্রথম আইটেম হল ফাংশন কল করা হচ্ছে এবং
বাকী আর্গুমেন্ট হল আর্গুমেন্ট যা পাস করা হচ্ছে। আসলে, Hy তে (অধিকাংশের মত
Lisps) আমরা প্লাস অপারেটরের কাছে একাধিক আর্গুমেন্ট পাস করতে পারি:
(+ 1 3 55)
যা 59 রিটার্ন করবে।
হয়তো আপনি আগে লিস্পের কথা শুনেছেন কিন্তু এটি সম্পর্কে অনেক কিছু জানেন না। লিস্প আপনার মতো কঠিন নয়
ভাবতে পারে, এবং Hy পাইথন থেকে উত্তরাধিকারসূত্রে পেয়েছে, তাই Hy হল Lisp শেখার একটি দুর্দান্ত উপায়।
লিস্প সম্পর্কে স্পষ্ট যে প্রধান জিনিসটি হল সেখানে প্রচুর বন্ধনী রয়েছে। এই হতে পারে
প্রথমে বিভ্রান্তিকর মনে হলেও এটি এত কঠিন নয়। আসুন কিছু সহজ গণিত দেখি
একগুচ্ছ বন্ধনীতে মোড়ানো যা আমরা হাই ইন্টারপ্রেটারে প্রবেশ করতে পারি:
(setv ফলাফল (- (/ (+ 1 3 88) 2) 8))
এই 38 ফিরে আসবে. কিন্তু কেন? ওয়েল, আমরা সমতুল্য অভিব্যক্তি তাকান পারে
অজগর:
ফলাফল = ((1 + 3 + 88) / 2) - 8
যদি আপনি উপরেরগুলি পাইথনে কীভাবে কাজ করে তা খুঁজে বের করার চেষ্টা করেন, আপনি অবশ্যই করবেন
প্রতিটি অভ্যন্তরীণ বন্ধনী সমাধান করে ফলাফল বের করুন। যে একই মৌলিক ধারণা
হাই আসুন পাইথনে প্রথমে এই অনুশীলনটি চেষ্টা করি:
ফলাফল = ((1 + 3 + 88) / 2) - 8
# সরলীকৃত করা হয়েছে...
ফলাফল = (92 / 2) - 8
# সরলীকৃত করা হয়েছে...
ফলাফল = 46 - 8
# সরলীকৃত করা হয়েছে...
ফলাফল = 38
এখন Hy তে একই জিনিস চেষ্টা করা যাক:
(setv ফলাফল (- (/ (+ 1 3 88) 2) 8))
; সরলীকৃত করা হয়েছে...
(setv ফলাফল (- (/ 92 2) 8))
; সরলীকৃত করা হয়েছে...
(setv ফলাফল (- 46 8))
; সরলীকৃত করা হয়েছে...
(setv ফলাফল 38)
আপনি সম্ভবত অনুমান, সঙ্গে এই শেষ অভিব্যক্তি সেটভি মানে ভেরিয়েবল বরাদ্দ করা
"ফলাফল" থেকে 38.
দেখা? খুব কঠিন না!
এটি লিস্পের মূল ভিত্তি। লিস্প মানে "লিস্ট প্রসেসিং"; এর মানে হল যে
প্রোগ্রামের গঠন আসলে তালিকার তালিকা। (যদি আপনি পাইথনের সাথে পরিচিত হন
তালিকা, উপরের মত সম্পূর্ণ একই কাঠামো কল্পনা করুন কিন্তু এর পরিবর্তে বর্গাকার বন্ধনী সহ, যেকোনও
আপনি উপরের কাঠামোটিকে একটি প্রোগ্রাম এবং ডেটাস্ট্রাকচার উভয় হিসাবে দেখতে সক্ষম হবেন।) এটি হল
আরও উদাহরণ দিয়ে বোঝা সহজ, তাই আসুন একটি সাধারণ পাইথন প্রোগ্রাম লিখি, এটি পরীক্ষা করি,
এবং তারপর সমতুল্য Hy প্রোগ্রাম দেখান:
def simple_conversation():
প্রিন্ট "হ্যালো! আমি আপনার সাথে পরিচিত হতে চাই। আমাকে আপনার সম্পর্কে বলুন!"
নাম = raw_input("আপনার নাম কি?")
বয়স = raw_input("আপনার বয়স কত?")
প্রিন্ট "হ্যালো " + নাম + "! আমি দেখছি তোমার বয়স " + বয়স + " বছর।"
সহজ_কথোপকথন()
যদি আমরা এই প্রোগ্রামটি চালাই, তাহলে এটি এরকম হতে পারে:
হ্যালো! আমার তোমাকে জানতে ইচ্ছা করে. আপনার সম্পর্কে বলুন!
আপনার নাম কি? গ্যারি
আপনার বয়স কত? 38
হ্যালো গ্যারি! আমি দেখছি আপনার বয়স 38 বছর।
এখন আসুন সমতুল্য Hy প্রোগ্রামটি দেখি:
(defn সহজ-কথোপকথন []
(প্রিন্ট "হ্যালো! আমি আপনাকে জানতে চাই। আমাকে আপনার সম্পর্কে বলুন!")
(setv নাম (কাঁচা-ইনপুট "আপনার নাম কি?"))
(setv বয়স (কাঁচা-ইনপুট "আপনার বয়স কত?"))
(মুদ্রণ (+ "হ্যালো " নাম"! আমি দেখতে পাচ্ছি আপনি"
বয়স "বছর বয়স।")))
(সরল-কথোপকথন)
আপনি উপরের প্রোগ্রাম তাকান, যতক্ষণ আপনি মনে রাখবেন যে প্রতিটি প্রথম উপাদান
প্রোগ্রামের তালিকা হল ফাংশন (বা ম্যাক্রো... আমরা পরে যাবো) কল করা হচ্ছে
এবং বাকিগুলো যুক্তি, এই সব মানে কি তা বের করা বেশ সহজ।
(যেমন আপনি সম্ভবত অনুমান করেছেন, defn পদ্ধতি সংজ্ঞায়িত করার হাই পদ্ধতি।)
তবুও, অনেক লোক প্রথমে এটিকে বিভ্রান্তিকর বলে মনে করে কারণ এখানে অনেক বন্ধনী রয়েছে,
কিন্তু এমন অনেকগুলি জিনিস রয়েছে যা এটিকে সহজ করতে সাহায্য করতে পারে: ইন্ডেন্টেশনকে সুন্দর রাখুন এবং
বন্ধনী ম্যাচিং সহ একটি এডিটর ব্যবহার করুন (এটি আপনাকে সাহায্য করবে প্রতিটি কি
বন্ধনী জোড়া হয়) এবং জিনিসগুলি আরামদায়ক বোধ করতে শুরু করবে।
একটি কোড স্ট্রাকচার থাকার কিছু সুবিধা রয়েছে যা আসলে একটি খুব সাধারণ ডেটা
লিস্পের মূল কাঠামোর উপর ভিত্তি করে। এক জিনিস জন্য, এর মানে হল যে আপনার প্রোগ্রাম
পার্স করা সহজ এবং প্রোগ্রামটির সম্পূর্ণ প্রকৃত কাঠামো খুব স্পষ্টভাবে উন্মুক্ত
তোমাকে. (hy-তে একটি অতিরিক্ত ধাপ রয়েছে যেখানে আপনি যে কাঠামোটি দেখেন তা পাইথনে রূপান্তরিত হয়
নিজস্ব উপস্থাপনা ... "বিশুদ্ধ" লিস্পে যেমন কমন লিস্প বা ইম্যাক্স লিস্প, ডেটা
আপনি কোডে যে স্ট্রাকচার দেখেন এবং ডাটা স্ট্রাকচার যেটি এক্সিকিউট হয় তা অনেক বেশি
আক্ষরিকভাবে বন্ধ।)
এর আরেকটি অন্তর্নিহিত অর্থ হল ম্যাক্রো: যদি একটি প্রোগ্রামের গঠন একটি সাধারণ ডেটা হয়
গঠন, তার মানে আপনি কোড লিখতে পারেন যে কোড লিখতে পারেন খুব সহজে, মানে
সম্পূর্ণ নতুন ভাষা বৈশিষ্ট্য বাস্তবায়ন খুব দ্রুত হতে পারে। হাই থেকে আগের, এই ছিল না
পাইথন প্রোগ্রামারদের জন্য খুবই সম্ভব... এখন আপনিও ম্যাক্রো ব্যবহার করতে পারবেন অবিশ্বাস্য
ক্ষমতা (শুধু তাদের পায়ের দিকে লক্ষ্য না করার জন্য সতর্ক থাকুন)!
Hy is a লিস্প-গন্ধযুক্ত পাইথন
হাই পাইথনের নিজস্ব বিমূর্ত সিনট্যাক্স ট্রিতে রূপান্তরিত করে, তাই আপনি শীঘ্রই এটি সব খুঁজে পেতে শুরু করবেন
পাইথনের পরিচিত শক্তি আপনার নখদর্পণে।
আপনার হাই-এ পাইথনের ডেটা প্রকার এবং স্ট্যান্ডার্ড লাইব্রেরিতে সম্পূর্ণ অ্যাক্সেস রয়েছে। পরীক্ষা করা যাক
হাই ইন্টারপ্রেটারে এর সাথে:
=> [১ ২ ৩]
[1, 2, 3]
=> {"কুকুর" "ঘেলা"
... "বিড়াল" "ম্যাও"}
...
{'কুকুর': 'বার্ক', 'বিড়াল': 'মিও'}
=> (, 1 2 3)
(1, 2, 3)
আপনি যদি অন্যান্য লিস্পের সাথে পরিচিত হন তবে আপনি আগ্রহী হতে পারেন যে Hy সাধারণকে সমর্থন করে
উদ্ধৃতির লিস্প পদ্ধতি:
=> '(1 2 3)
(1L 2L 3L)
আপনার কাছে সমস্ত বিল্ট-ইন ধরণের চমৎকার পদ্ধতিতে অ্যাক্সেস রয়েছে:
=> (. স্ট্রিপ " fooooo ")
"ফুওওও"
এটা কী? হ্যাঁ প্রকৃতপক্ষে, এটি অবিকল একই রকম:
"fooooo"। স্ট্রিপ()
এটা ঠিক---বিন্দু স্বরলিপি সহ লিস্প! যদি আমরা এই স্ট্রিং একটি পরিবর্তনশীল হিসাবে বরাদ্দ আছে, আমরা
এছাড়াও নিম্নলিখিত করতে পারেন:
(সেটিভি এই-স্ট্রিং " fooooo ")
(this-string.strip)
শর্তাবলী সম্পর্কে কি?:
(যদি (কিছু-কিছু চেষ্টা করুন)
(প্রিন্ট করুন "এটি যদি সত্য হয়")
(প্রিন্ট "এটি যদি মিথ্যা হয়"))
আপনি উপরে বলতে পারেন, প্রথম যুক্তি if একটি সত্য পরীক্ষা, দ্বিতীয় যুক্তি হয়
যদি সত্য হয়, এবং তৃতীয় যুক্তি (ঐচ্ছিক!) যদি মিথ্যা হয় (যেমন। আর).
আপনি যদি আরও জটিল শর্তসাপেক্ষে কাজ করতে চান তবে আপনি দেখতে পাবেন যে আপনার কাছে নেই Elif
Hy এ উপলব্ধ। পরিবর্তে, আপনি নামক কিছু ব্যবহার করা উচিত Cond. পাইথনে, আপনি করতে পারেন
কিছুটা এইরকম:
somevar = 33
যদি কিছু> 50 হয়:
প্রিন্ট "এই পরিবর্তনশীল খুব বড়!"
এলিফ সামভার <10:
প্রিন্ট "এই পরিবর্তনশীল খুব ছোট!"
অন্য:
প্রিন্ট "ওই ভেরিয়েবল ঠিক ঠিক আছে!"
Hy তে, আপনি করবেন:
(cond
[(> somevar 50)
(প্রিন্ট করুন "সেই পরিবর্তনশীলটি খুব বড়!")]
[(< somevar 10)
(প্রিন্ট করুন "সেই ভেরিয়েবলটি খুবই ছোট!")]
[সত্য
(প্রিন্ট করুন "সেই ভেরিয়েবলটি ঠিক আছে!")])
আপনি কি লক্ষ্য করবেন যে Cond একটি কিছু বিবৃতির মধ্যে সুইচ অফ করে যা কার্যকর করা হয় এবং
সত্য বা মিথ্যার জন্য শর্তসাপেক্ষে পরীক্ষা করা হয়েছে, এবং তারপরে এটি চালু হলে চালানোর জন্য কিছু কোড
সত্য হতে আউট এছাড়াও আপনি লক্ষ্য করবেন যে আর দ্বারা সহজভাবে শেষে বাস্তবায়িত হয়
জন্য পরীক্ষা সত্য -- এটার কারন সত্য সর্বদা সত্য হবে, তাই যদি আমরা এতদূর পাই, আমরা করব
সবসময় যে এক চালান!
আপনি উপরে লক্ষ্য করতে পারেন যে আপনার যদি কোড থাকে:
(যদি কিছু শর্ত থাকে
(শরীর-যদি-সত্য)
(শরীর-যদি-মিথ্যা))
কিন্তু অপেক্ষা করো! আপনি যদি একটির শরীরে একাধিক বিবৃতি কার্যকর করতে চান তবে কী হবে
এইগুলো?
আপনি নিম্নলিখিত করতে পারেন:
(যদি (কিছু-কিছু চেষ্টা করুন)
(কর
(প্রিন্ট করুন "এটি যদি সত্য হয়")
(প্রিন্ট "এবং কেন নয়, আসুন এটি কতটা সত্য সে সম্পর্কে কথা বলা যাক!))
(প্রিন্ট করুন "এটি এখনও কেবল মিথ্যা"))
আপনি দেখতে পাচ্ছেন যে আমরা ব্যবহার করেছি do একাধিক বিবৃতি মোড়ানো। আপনি যদি অন্যের সাথে পরিচিত হন
Lisps, এই সমতুল্য progn অন্যত্র।
মন্তব্য সেমিকোলন দিয়ে শুরু হয়:
(প্রিন্ট "এটি চলবে")
; (প্রিন্ট "কিন্তু এটি হবে না")
(+ 1 2 3); আমরা সংযোজন কার্যকর করব, কিন্তু এই মন্তব্য নয়!
লুপিং কঠিন নয় কিন্তু এক ধরনের বিশেষ কাঠামো আছে। পাইথনে, আমরা করতে পারি:
আমি জন্য পরিসর(10)
প্রিন্ট "'i' এখন " + str(i) এ আছে
Hy এর সমতুল্য হবে:
(এর জন্য [i (পরিসীমা 10)]
(মুদ্রণ (+ "'i' এখন " (str i))))
আপনি বিভিন্ন পাইথন লাইব্রেরি আমদানি এবং ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:
(ওএস আমদানি করুন)
(যদি (os.path.isdir "/tmp/somedir")
(os.mkdir "/tmp/somedir/anotherdir")
(প্রিন্ট "আরে, সেই পথটি সেখানে নেই!"))
পাইথনের প্রসঙ্গ পরিচালক (সঙ্গে বিবৃতি) এই মত ব্যবহার করা হয়:
(সহ [[f ("/tmp/data.in" খুলুন)]]
(প্রিন্ট (.পড়ুন চ)))
যা সমতুল্য:
f হিসাবে open("/tmp/data.in") সহ:
প্রিন্ট f.read()
এবং হ্যাঁ, আমাদের তালিকা বোঝার ক্ষমতা আছে! পাইথনে আপনি করতে পারেন:
odds_squared = [
পাউ (সংখ্যা, 2)
সংখ্যার জন্য পরিসর(100)
যদি সংখ্যা % 2 == 1]
Hy তে, আপনি এইগুলি করতে পারেন:
(setv odds-squared
(তালিকা-কম্পাঙ্ক
(পাউ নম্বর 2)
(সংখ্যা (সীমা 100))
(= (% সংখ্যা 2) 1)))
; এবং, Clojure পৃষ্ঠা থেকে নির্লজ্জভাবে চুরি করা একটি উদাহরণ:
; একটি চেসবোর্ডের সমস্ত ব্লকের তালিকা করা যাক:
(তালিকা-কম্পাঙ্ক
(, xy)
(x (সীমা 8)
y "ABCDEFGH"))
; [(0, 'A'), (0, 'B'), (0, 'C'), (0, 'D'), (0, 'E'), (0, 'F'), ( 0, 'G'), (0, 'H'),
; (1, 'A'), (1, 'B'), (1, 'C'), (1, 'D'), (1, 'E'), (1, 'F'), (1 , 'G'), (1, 'H'),
; (2, 'A'), (2, 'B'), (2, 'C'), (2, 'D'), (2, 'E'), (2, 'F'), (2 , 'G'), (2, 'H'),
; (3, 'A'), (3, 'B'), (3, 'C'), (3, 'D'), (3, 'E'), (3, 'F'), (3 , 'G'), (3, 'H'),
; (4, 'A'), (4, 'B'), (4, 'C'), (4, 'D'), (4, 'E'), (4, 'F'), (4 , 'G'), (4, 'H'),
; (5, 'A'), (5, 'B'), (5, 'C'), (5, 'D'), (5, 'E'), (5, 'F'), (5 , 'G'), (5, 'H'),
; (6, 'A'), (6, 'B'), (6, 'C'), (6, 'D'), (6, 'E'), (6, 'F'), (6 , 'G'), (6, 'H'),
; (7, 'A'), (7, 'B'), (7, 'C'), (7, 'D'), (7, 'E'), (7, 'F'), (7 , 'G'), (7, 'H')]
পাইথনের বিভিন্ন অভিনব যুক্তি এবং কীওয়ার্ড আর্গুমেন্টের সমর্থন রয়েছে। পাইথনে আমরা হতে পারি
দেখুন:
>>> def optional_arg(pos1, pos2, keyword1=None, keyword2=42):
... ফেরত [pos1, pos2, keyword1, keyword2]
...
>>> ঐচ্ছিক_আর্গ(1, 2)
[১, ২, কোনোটিই নয়, ৪২]
>>> ঐচ্ছিক_আর্গ(1, 2, 3, 4)
[১, ৩, ৫, ১]
>>> ঐচ্ছিক_আর্গ(কীওয়ার্ড1=1, pos2=2, pos1=3, কীওয়ার্ড2=4)
[১, ৩, ৫, ১]
Hy তে একই জিনিস:
=> (defn ঐচ্ছিক-আর্গ [pos1 pos2 & ঐচ্ছিক কীওয়ার্ড1 [কীওয়ার্ড2 42]]
... [pos1 pos2 keyword1 keyword2])
=> (ঐচ্ছিক-আর্গ 1 2)
[১ ২ না ৪২]
=> (ঐচ্ছিক-আর্গ 1 2 3 4)
[১ ২ ৩ ৪]
আপনি যদি Hy past 0.10.1 (যেমন, git master) এর একটি সংস্করণ চালাচ্ছেন তবে একটি চমৎকার নতুনও রয়েছে
কীওয়ার্ড আর্গুমেন্ট সিনট্যাক্স:
=> (ঐচ্ছিক-আর্গ :কীওয়ার্ড1 1
... :pos2 2
... :pos1 3
... :কীওয়ার্ড2 4)
[১, ৩, ৫, ১]
অন্যথায়, আপনি সবসময় ব্যবহার করতে পারেন প্রয়োগ করা. কিন্তু কি প্রয়োগ করা?
আপনি পাস সঙ্গে পরিচিত *আর্গস এবং **কোয়ার্গস পাইথনে?:
>>> args = [1 2]
>>> kwargs = {"keyword2": 3
... "কীওয়ার্ড1": 4}
>>> ঐচ্ছিক_আর্গ(*args, **kwargs)
আমরা এর সাথে এটি পুনরুত্পাদন করতে পারি প্রয়োগ করা:
=> (setv args [1 2])
=> (setv kwargs {"keyword2" 3
... "কীওয়ার্ড1" 4})
=> (ঐচ্ছিক-আর্গ args kwargs প্রয়োগ করুন)
[১, ৩, ৫, ১]
একটি অভিধান-শৈলী কীওয়ার্ড আর্গুমেন্ট নির্মাণও রয়েছে যা দেখতে এইরকম:
(defn অন্য-শৈলী [&key {"key1" "val1" "key2" "val2"}]
[কী1 কী2])
এখানে পার্থক্য হল যেহেতু এটি একটি অভিধান, আপনি কোনো নির্দিষ্ট উপর নির্ভর করতে পারবেন না
আর্গুমেন্ট আদেশ.
হাইও সমর্থন করে *আর্গস এবং **কোয়ার্গস. পাইথনে:
def some_func(foo, bar, *args, **kwargs):
প্রিন্ট আমদানি করুন
pprint.pprint((foo, bar, args, kwargs))
হাই সমতুল্য:
(defn some-func [foo bar &rest args &kwargs kwargs]
(প্রিন্ট আমদানি)
(pprint.pprint (, foo bar args kwargs)))
অবশেষে, অবশ্যই আমাদের ক্লাস দরকার! পাইথনে, আমাদের একটি ক্লাস থাকতে পারে:
ক্লাস FooBar(অবজেক্ট):
"" "
তবুও আরেকটি উদাহরণ ক্লাস
"" "
def __init__(self, x):
self.x = x
def get_x(self):
"" "
আমাদের x এর কপি ফেরত দিন
"" "
স্ব.x ফেরত দিন
হাইতে:
(defclass FooBar [অবজেক্ট]
"এখনও আরেকটি উদাহরণ ক্লাস"
[[--এটা--
(fn [self x]
(setv self.xx)
; বর্তমানে --init--এর জন্য প্রয়োজন কারণ __init__-এর কোনো প্রয়োজন নেই
; আশা করি এটি চলে যাবে :)
কোনটিই নয়)]
[গেট-এক্স
(fn [স্বয়ং]
"আমাদের x এর কপি ফেরত দাও"
self.x)]])
আপনি ক্লাস-স্তরের বৈশিষ্ট্যগুলিও করতে পারেন। পাইথনে:
শ্রেণীর গ্রাহক (মডেল। মডেল):
নাম = মডেল। চারফিল্ড(সর্বোচ্চ_দৈর্ঘ্য=255)
ঠিকানা = মডেল। টেক্সটফিল্ড()
নোট = মডেল। টেক্সটফিল্ড()
হাইতে:
(defclass গ্রাহক [models.Model]
[[নাম (মডেল। চারফিল্ড : সর্বোচ্চ দৈর্ঘ্য 255})]
[ঠিকানা (মডেল। টেক্সটফিল্ড)]
[নোট (মডেল। টেক্সটফিল্ড)]])
Hy <-> পাইথন ইন্টারপ
Hy আমদানি করে, আপনি পাইথন থেকে সরাসরি Hy ব্যবহার করতে পারেন!
আপনি যদি নিম্নলিখিত সংরক্ষণ করুন greetings.hy:
(defn greet [name] (প্রিন্ট করুন "হ্যালো ফ্রম হাই," নাম))
তারপর আপনি মডিউল আমদানি করার আগে hy আমদানি করে সরাসরি পাইথন থেকে এটি ব্যবহার করতে পারেন। ভিতরে
পাইথন:
হাই আমদানি করুন
অভিবাদন আমদানি করুন
greetings.greet("Foo")
আপনি পাইথনে একটি ফাংশন ঘোষণা করতে পারেন (বা এমনকি একটি ক্লাস!) এবং এটি Hy!
আপনি যদি নিম্নলিখিত সংরক্ষণ করুন greetings.py পাইথনে:
def greet(নাম):
মুদ্রণ ("হ্যালো, %s" % (নাম))
আপনি Hy তে এটি ব্যবহার করতে পারেন:
(আমদানি শুভেচ্ছা)
(. শুভেচ্ছা অভিবাদন "foo")
কীওয়ার্ড আর্গুমেন্ট ব্যবহার করতে, আপনি ব্যবহার করতে পারেন greetings.py:
def greet(নাম, শিরোনাম="স্যার"):
মুদ্রণ ("অভিবাদন, %s %s" % (শিরোনাম, নাম))
(আমদানি শুভেচ্ছা)
(. শুভেচ্ছা অভিবাদন "Foo")
(. শুভেচ্ছা অভিবাদন "Foo" "Darth")
(প্রয়োগ করুন (. শুভেচ্ছা অভিবাদন) ["Foo"] {"title" "Lord"})
যা আউটপুট হবে:
অভিবাদন, স্যার ফু
শুভেচ্ছা, ডার্থ ফু
অভিবাদন, লর্ড ফু
প্রোটিপস !
Hy তে "থ্রেডিং ম্যাক্রো" নামে পরিচিত কিছু বৈশিষ্ট্যও রয়েছে, যা একটি সত্যিই ঝরঝরে বৈশিষ্ট্য
Clojure এর. "থ্রেডিং ম্যাক্রো" (এভাবে লেখা ->) এর গভীর বাসা এড়াতে ব্যবহৃত হয়
অভিব্যক্তি
থ্রেডিং ম্যাক্রো প্রতিটি এক্সপ্রেশনকে পরবর্তী এক্সপ্রেশনের প্রথম আর্গুমেন্টে সন্নিবেশিত করে
জায়গা।
চলুন ক্লাসিক নেওয়া যাক:
(লুপ (মুদ্রণ (ইভাল (পড়ুন))))
এটি এমনভাবে লেখার পরিবর্তে, আমরা এটিকে নিম্নরূপ লিখতে পারি:
(-> (পড়ুন) (ইভাল) (প্রিন্ট) (লুপ))
এখন, ব্যবহার করে python-sh, আমরা দেখাতে পারি কিভাবে থ্রেডিং ম্যাক্রো (পাইথন-শ এর সেটআপের কারণে)
একটি পাইপ মত ব্যবহার করা যেতে পারে:
=> (আমদানি [sh [cat grep wc]])
=> (-> (বিড়াল "/usr/share/dict/words") (grep "-E" "^hy") (wc "-l"))
210
যা, অবশ্যই, প্রসারিত হয়:
(wc (grep (cat "/usr/share/dict/words") "-E" "^hy") "-l")
অনেক বেশি পঠনযোগ্য, না? থ্রেডিং ম্যাক্রো ব্যবহার করুন!
HY শৈলী গাইড
"আপনি জানেন, মন্ত্রী, আমি ডাম্বলডোরের সাথে অনেক বিষয়ে একমত নই... কিন্তু আপনি অস্বীকার করতে পারবেন না যে তিনি
শৈলী পেয়েছি..." - ফিনিয়াস নাইজেলাস ব্ল্যাক, লুণ্ঠন করা কুলাল এবং দ্য অর্ডার of দ্য ফিনিক্স
Hy স্টাইল গাইডটি Hyve (হ্যাঁ, Hy সম্প্রদায়ের জন্য মৌলিক নিয়মগুলির একটি সেট হতে চায়
সব কিছুর সাথে Hy যুক্ত করে নিজেকে গর্বিত করে) ইডিওমেটিক হাই কোড লিখতে। হাই অনেক আহরণ
Clojure এবং Common Lisp থেকে, সর্বদা পাইথন আন্তঃব্যবস্থা বজায় রাখার সময়।
প্রস্তাবনা
সার্জারির tao of Hy
উম্মন প্রধান সন্ন্যাসীকে জিজ্ঞাসা করলেন, "আপনি কোন সূত্রের উপর বক্তৃতা করছেন?"
"নির্বাণ সূত্র।"
"নির্বাণ সূত্রে চারটি গুণ আছে, তাই না?"
"ইহা ছিল."
উম্মন একটা পেয়ালা তুলে জিজ্ঞেস করল, "এর কত ফজিলত আছে?"
"কিছুই না," সন্ন্যাসী বললেন।
"কিন্তু প্রাচীন লোকেরা বলেছিল, তাই না?" Ummon বলেন.
"তারা যা বলেছে তাতে কি মনে হয়?"
উম্মন কাপটা মেরে জিজ্ঞেস করল, বুঝলি?
"না," সন্ন্যাসী বললেন।
"তাহলে," উম্মন বললেন, "তুমি সুত্রের উপর তোমার বক্তৃতা দিয়ে যেতে পারো।"
— (কোয়ান) ম্যাক্রো
নিম্নলিখিত নকশা সিদ্ধান্তের একটি সংক্ষিপ্ত তালিকা চিত্রিত করে যা তৈরি করা হয়েছিল
হাই
· একটি Lisp মত চেহারা; এটির সাথে DTRT (যেমন ড্যাশগুলি আন্ডারস্কোরে পরিণত হয়, কানের পাল্টে যায়
সব ক্যাপ).
আমরা এখনও পাইথন। বেশিরভাগ অভ্যন্তরীণগুলি পাইথন অভ্যন্তরীণগুলিতে 1:1 অনুবাদ করে।
· সর্বত্র ইউনিকোড ব্যবহার করুন।
পাইথন 2-এ খারাপ সিদ্ধান্তগুলি ঠিক করুন যখন আমরা পারি (দেখুন সত্য_বিভাগ).
· সন্দেহ হলে, পাইথন থেকে বিরত থাকুন।
· আপনি যদি এখনও অনিশ্চিত হন, তাহলে Clojure এ পিছিয়ে যান।
· আপনি যদি আরও বেশি অনিশ্চিত হন, তাহলে কমন লিস্পে যেতে দিন।
মনে রাখবেন আমরা Clojure নই। আমরা কমন লিস্প নই। আমরা হোমোইকনিক পাইথন, সাথে
অতিরিক্ত বিট যে অর্থপূর্ণ.
বিন্যাস & খাঁজ
· পিছনের স্থানগুলি এড়িয়ে চলুন। তারা চুষে!
ইন্ডেন্টেশন 2টি স্পেস হতে হবে (কোনও হার্ড ট্যাব নেই), যখন এর ইন্ডেন্টেশনের সাথে মেলে
আগের লাইন।
;; ভাল (এবং পছন্দের)
(defn fib [n]
(যদি (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
;; এখনও ঠিক আছে
(defn fib [n]
(যদি (<= n 2) n (+ (fib (- n 1)) (fib (- n 2)))))
;; এখনও ঠিক আছে
(defn fib [n]
(যদি (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
;; হিস্টিরিয়ালি হাস্যকর
(defn fib [n]
(যদি (<= n 2)
n;; হ্যাঁ, আমি এলোমেলোভাবে স্পেস কী আঘাত করতে পছন্দ করি
(+ (fib (- n 1)) (fib (- n 2)))))
বন্ধনী অবশ্যই না তাদের নিজস্ব লাইনে একা, দু: খিত এবং একা ছেড়ে দেওয়া হবে.
;; ভাল (এবং পছন্দের)
(defn fib [n]
(যদি (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
;; হিস্টিরিয়ালি হাস্যকর
(defn fib [n]
(যদি (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))
)
); গাহ, আগুন দিয়ে পুড়িয়ে দাও
· উল্লম্বভাবে সারিবদ্ধ দিন ব্লক।
(চলুন [[foo (বার)]
[কিউএক্স (বাজ)]]
(foo qux))
· ইনলাইন মন্তব্যগুলি কোডের শেষ থেকে দুটি স্পেস হতে হবে; তাদের সবসময় একটি থাকতে হবে
মন্তব্যের অক্ষর এবং মন্তব্যের শুরুর মধ্যে স্থান। এছাড়াও, না করার চেষ্টা করুন
স্পষ্ট মন্তব্য করুন।
;; ভাল
(setv ind (dec x)); ইনডেক্সিং 0 থেকে শুরু হয়
;; শৈলী-সঙ্গত কিন্তু শুধু সুস্পষ্ট রাষ্ট্র
(setv ind (dec x)); x-1 সূচী সেট করে
;; খারাপ
(setv ind (dec x)); মজার জন্য শব্দ টাইপ করা
কোডিং শৈলী
একটি নিয়ম হিসাবে, ব্যবহার না করার চেষ্টা করুন Def গ্লোবাল ভেরিয়েবল ছাড়া অন্য কিছুর জন্য; ব্যবহার সেটভি
ভিতরে ফাংশন, লুপ, ইত্যাদি
;; ভাল (এবং পছন্দের)
(def *সীমা * 400000)
(defn fibs [ab]
(যদিও সত্য
(ফলন ক)
(setv (, ab) (, b (+ ab)))))
;; খারাপ (এবং পছন্দের নয়)
(defn fibs [ab]
(যদিও সত্য
(ফলন ক)
(def (, ab) (, b (+ ab)))))
যেখানে ভেক্টর সিনট্যাক্সের উদ্দেশ্যে s-এক্সপ্রেশন সিনট্যাক্স ব্যবহার করবেন না। উদাহরণস্বরূপ, ঘটনা
এই দুটি উদাহরণের আগেরটি কাজ করে কারণ কম্পাইলার অত্যধিক নয়
কঠোর বাস্তবে, সঠিক সিনট্যাক্স যেমন এই মত জায়গায়.
;; খারাপ (এবং মন্দ)
(defn foo (x) (প্রিন্ট x))
(foo 1)
;; ভাল (এবং পছন্দের)
(defn foo [x] (প্রিন্ট x))
(foo 1)
গভীরভাবে নেস্টেডের সম্মুখীন হলে থ্রেডিং ম্যাক্রো বা থ্রেডিং টেল ম্যাক্রো ব্যবহার করুন
s- অভিব্যক্তি। যাইহোক, এগুলি ব্যবহার করার সময় বিচক্ষণ হোন। স্বচ্ছতা এবং যখন তাদের ব্যবহার করবেন
পঠনযোগ্যতা উন্নত হয়; জটিল, অভিব্যক্তি বোঝা কঠিন নির্মাণ করবেন না।
;; পছন্দের
(def *নাম*
(এর সাথে [f ("names.txt" খুলুন)]
(-> (.read f) (.strip) (.replace "\"" "") (.split ",") (sorted))))
;; এত ভালো না
(def *নাম*
(এর সাথে [f ("names.txt" খুলুন)]
(বাছাই করা হয়েছে (.split "," (.replace "\"" "" (.strip (.read f)))))))
;; সম্ভবত একটি ভাল ধারণা না
(defn বর্গ? [x]
(->> 2 (পাউ (int (sqrt x))) (= x)))
বস্তুর পদ্ধতির সরাসরি কলের চেয়ে Clojure-শৈলী ডট নোটেশন পছন্দ করা হয়,
উভয় সমর্থন করা অব্যাহত থাকবে যদিও.
;; ভাল
(এর সাথে [fd (খোলা"/ Etc / passwd")]
(প্রিন্ট (.readlines fd)))
;; এত ভালো না
(এর সাথে [fd (খোলা"/ Etc / passwd")]
(প্রিন্ট (fd.readlines)))
উপসংহার
"ফ্যাশন বিবর্ণ, শৈলী চিরন্তন" - ইয়েভেস সেন্ট লরেন্ট
এই নির্দেশিকা শুধুমাত্র সম্প্রদায় নির্দেশিকাগুলির একটি সেট, এবং স্পষ্টতই, সম্প্রদায় নির্দেশিকাগুলি করে৷
একটি সক্রিয় সম্প্রদায় ছাড়া অর্থহীন. অবদান স্বাগত জানাই. #hy in-এ আমাদের সাথে যোগ দিন
freenode, এটি সম্পর্কে ব্লগ, এটি সম্পর্কে টুইট, এবং সবচেয়ে গুরুত্বপূর্ণ, Hy এর সাথে মজা করুন।
ধন্যবাদ
· এই নির্দেশিকাটি থেকে ব্যাপকভাবে অনুপ্রাণিত @পল্টাগ এর ব্লগ পোস্ট Hy উদ্বর্তন গাইড
· দ্য Clojure শৈলী গাইড
উপস্থাপনা এর INDEX
সূচিপত্র:
আদেশ লাইন ইন্টারফেস
hy
আদেশ লাইন অপশন সমূহ
-c
মধ্যে Hy কোড কার্যকর করুন হুকুম.
$ hy -c "(মুদ্রণ (+ 2 2))"
4
-i
মধ্যে Hy কোড কার্যকর করুন হুকুম, তারপর REPL এ থাকুন।
-m
মধ্যে Hy কোড কার্যকর করুন মডিউলসহ defmain যদি সংজ্ঞায়িত করা হয়।
সার্জারির -m পতাকা বিকল্প তালিকা বন্ধ করে দেয় যাতে এর পরে সমস্ত আর্গুমেন্ট মডিউল নাম
মধ্যে মডিউল পাস করা হয় sys.argv.
0.10.2 সংস্করণে নতুন।
--গুপ্তচর কার্যকর করার আগে সমতুল্য পাইথন কোড প্রিন্ট করুন। উদাহরণ স্বরূপ:
=> (defn salutationsnm [name] (মুদ্রণ (+ "Hy " name"!")))
def salutationsnm(নাম):
রিটার্ন প্রিন্ট(((u'Hy ' + name) + u'!'))
=> (অভিবাদন "আপনার নাম")
অভিবাদন (u'Your Name')
হাই তোমার নাম!
=>
0.9.11 সংস্করণে নতুন।
--শো-ট্রেসব্যাক
Hy ব্যতিক্রমের জন্য বর্ধিত ট্রেসব্যাক প্রিন্ট করুন।
0.9.12 সংস্করণে নতুন।
-v হাই সংস্করণ নম্বর প্রিন্ট করুন এবং প্রস্থান করুন।
hyc
আদেশ লাইন অপশন সমূহ
ফাইল[, ফাইলএন]
হাই কোড পাইথন বাইটকোডে কম্পাইল করুন। উদাহরণস্বরূপ, নিম্নলিখিত কোড হিসাবে সংরক্ষণ করুন
hyname.hy:
(defn hy-hy [নাম]
(মুদ্রণ (+ "হাই " নাম"!")))
(হাই-হাই "আফ্রোম্যান")
তারপর চালান:
$ hyc hyname.hy
$python hyname.pyc
হাই আফ্রোম্যান!
hy2py
0.10.1 সংস্করণে নতুন।
আদেশ লাইন অপশন সমূহ
-s
--উৎস সহ
পার্সড সোর্স স্ট্রাকচার দেখান।
-a
--with-ast
উৎপন্ন AST দেখান।
-এনপি
--পাইথন ছাড়া
AST থেকে উৎপন্ন পাইথন কোড দেখাবেন না।
Hy (দ্য ভাষা)
সতর্কতা:
এটি অসম্পূর্ণ; ডকুমেন্টেশন প্রচেষ্টা অবদান বিবেচনা করুন.
তত্ত্ব of Hy
হাই, সব কিছুর উপরে, পাইথনের সাথে উভয় দিকেই 100% সামঞ্জস্য বজায় রাখে
নিজেই সমস্ত হাই কোড কয়েকটি সহজ নিয়ম অনুসরণ করে। এই মুখস্ত, এটা আসতে যাচ্ছে হিসাবে
সহজ
এই নিয়মগুলি নিশ্চিত করতে সাহায্য করে যে Hy কোডটি ইডিওম্যাটিক এবং উভয় ভাষায় ইন্টারফেসযোগ্য।
· ইয়ারমুফের চিহ্নগুলি সেই স্ট্রিংয়ের উপরের-কেস সংস্করণে অনুবাদ করা হবে। জন্য
উদাহরণ, foo বিন্যাস হয়ে যাবে যদি foo.
· UTF-8 সত্তা ব্যবহার করে এনকোড করা হবে punycode এবং সঙ্গে উপসর্গ হাই_। এই ক্ষেত্রে, ⚘
হয়ে যাবে hy_w7h, ♥ হয়ে যাবে hy_g6h, এবং আমি♥ হয়ে যাবে hy_iu_t0x.
· যে চিহ্নগুলিতে ড্যাশ রয়েছে সেগুলিকে আন্ডারস্কোর দিয়ে প্রতিস্থাপন করা হবে। উদাহরণ স্বরূপ,
রেন্ডার-টেমপ্লেট হয়ে যাবে রেন্ডার_টেমপ্লেট. এর মানে ড্যাশ সহ প্রতীক হবে
ছায়া তাদের আন্ডারস্কোর সমতুল্য, এবং তদ্বিপরীত.
অন্তর্নির্মিত ইন
Hy-এ বেশ কয়েকটি বিশেষ ফর্ম রয়েছে যা সঠিক Python AST তৈরি করতে সাহায্য করতে ব্যবহৃত হয়।
নিম্নলিখিতগুলি "বিশেষ" ফর্মগুলি, যেগুলির মধ্যে এমন আচরণ থাকতে পারে যা কিছুটা অপ্রত্যাশিত৷
কিছু পরিস্থিতিতে।
.
0.10.0 সংস্করণে নতুন।
. অবজেক্টে অ্যাট্রিবিউট অ্যাক্সেস করতে ব্যবহৃত হয়। এটি দ্রুত অনুমতি দেওয়ার জন্য একটি ছোট ডিএসএল ব্যবহার করে
নেস্টেড ডেটা স্ট্রাকচারে অ্যাট্রিবিউট এবং আইটেমগুলিতে অ্যাক্সেস।
এই ক্ষেত্রে,
(. foo bar baz [(+ 1 2)] frob)
নিচে কম্পাইল করে:
foo.bar.baz[1 + 2].frob
. এর প্রথম আর্গুমেন্ট কম্পাইল করে (উদাহরণে, foo বিন্যাস) বস্তু হিসাবে যা করতে হবে
বৈশিষ্ট্য dereference. এটি অ্যাক্সেসের বৈশিষ্ট্য হিসাবে খালি প্রতীক ব্যবহার করে (উদাহরণস্বরূপ, বার,
ভিত্তি, frob), এবং তালিকার বিষয়বস্তু কম্পাইল করে (উদাহরণে, [(+ 1 2)]) সূচীকরণের জন্য।
অন্যান্য আর্গুমেন্ট একটি সংকলন ত্রুটি নিক্ষেপ.
অজানা গুণাবলী অ্যাক্সেস একটি নিক্ষেপ বৈশিষ্ট্য ত্রুটি. অজানা কী অ্যাক্সেস একটি নিক্ষেপ
সূচিপত্র (তালিকা এবং টিপলে) বা ক কী ত্রুটি (অভিধানে)।
->
-> (অথবা থ্রেডিং ম্যাক্রো) এক্সপ্রেশনের নেস্টিং এড়াতে ব্যবহৃত হয়। থ্রেডিং ম্যাক্রো
পরবর্তী এক্সপ্রেশনের প্রথম আর্গুমেন্ট জায়গায় প্রতিটি এক্সপ্রেশন সন্নিবেশ করায়। অনুসরণ
কোড এটি প্রদর্শন করে:
=> (defn আউটপুট [a b] (প্রিন্ট a b))
=> (-> (+ 4 6) (আউটপুট 5))
10 5
- >>
- >> (অথবা থ্রেডিং লেজ ম্যাক্রো) অনুরূপ থ্রেডিং ম্যাক্রোপরিবর্তে, কিন্তু
পরবর্তী এক্সপ্রেশনের প্রথম আর্গুমেন্টে প্রতিটি এক্সপ্রেশন ঢোকানো, এটি এটি হিসাবে যুক্ত করে
শেষ যুক্তি। নিম্নলিখিত কোড এটি প্রদর্শন করে:
=> (defn আউটপুট [a b] (প্রিন্ট a b))
=> (->> (+ 4 6) (আউটপুট 5))
5 10
প্রয়োগ করা
প্রয়োগ করা আর্গুমেন্টের ঐচ্ছিক তালিকা এবং কোয়ার্গের ঐচ্ছিক অভিধান প্রয়োগ করতে ব্যবহৃত হয়
একটি ফাংশনে
ব্যবহার: (প্রয়োগ করুন fn-নাম [আর্গস] [কোয়ার্গস])
উদাহরণ:
(defn thunk []
"হাই সেখানে")
(থাঙ্ক প্রয়োগ করুন)
;=> "হাই ওখানে"
(defn মোট-ক্রয় [মূল্যের পরিমাণ এবং ঐচ্ছিক [ফি 1.05] [ভ্যাট 1.1]]
(* মূল্য পরিমাণ ফি ভ্যাট))
(মোট-ক্রয় প্রয়োগ করুন [10 15])
;=> 173.25
(মোট-ক্রয় প্রয়োগ করুন [10 15] {"ভ্যাট" 1.05})
;=> 165.375
(মোট-ক্রয়ের জন্য প্রয়োগ করুন [] {"মূল্য" 10 "অ্যামাউন্ট" 15 "ভ্যাট" 1.05})
;=> 165.375
এবং
এবং যৌক্তিক অভিব্যক্তিতে ব্যবহৃত হয়। এটি কমপক্ষে দুটি পরামিতি লাগে। যদি সব পরামিতি
মূল্যায়ন সত্য, শেষ পরামিতি ফেরত দেওয়া হয়। অন্য কোন ক্ষেত্রে, প্রথম মিথ্যা মান
ফেরত দেওয়া হবে। উদাহরণ ব্যবহার:
=> (এবং সত্য মিথ্যা)
মিথ্যা
=> (এবং সত্য সত্য)
সত্য
=> (এবং সত্য 1)
1
=> (এবং সত্য [] মিথ্যা সত্য)
[]
লক্ষ্য করুন:
এবং শর্ট-সার্কিট এবং প্রথম মিথ্যা হওয়ার সাথে সাথে পরামিতিগুলি মূল্যায়ন করা বন্ধ করে দেয়
সম্মুখীন।
=> (এবং মিথ্যা ("হ্যালো" মুদ্রণ))
মিথ্যা
জাহির করা
জাহির করা প্রোগ্রাম চলাকালীন শর্ত যাচাই করতে ব্যবহৃত হয়। শর্ত না থাকলে
দেখা, একটি দাবীর ত্রুটি উত্থাপিত হয়. জাহির করা এক বা দুটি পরামিতি নিতে পারে। প্রথম
পরামিতি হল পরীক্ষা করার শর্ত, এবং এটি উভয়েরই মূল্যায়ন করা উচিত সত্য or মিথ্যা. দ্য
দ্বিতীয় প্যারামিটার, ঐচ্ছিক, দাবির জন্য একটি লেবেল, এবং স্ট্রিংটি হবে
সঙ্গে উত্থাপিত দাবীর ত্রুটি। উদাহরণ স্বরূপ:
(আবেদন (= পরিবর্তনশীল প্রত্যাশিত-মান))
(মিথ্যা দাবি)
; দাবীর ত্রুটি
(আবেদন (= 1 2) "একটি সমান দুইটি")
; দাবীর ত্রুটি: একজনের সমান দুই হওয়া উচিত
সহযোগিতা
সহযোগিতা একটি অভিধানে একটি মানের সাথে একটি কী যুক্ত করতে বা একটি তালিকার একটি সূচক সেট করতে ব্যবহৃত হয়
একটি মান এটি অন্তত তিনটি পরামিতি লাগে: উপাত্ত গঠন পরিবর্তন করা, ক চাবি
or সূচক, এবং একটি মূল্য. যদি তিনটির বেশি প্যারামিটার ব্যবহার করা হয়, তাহলে এটি জোড়ায় জোড়ায় যুক্ত হবে।
ব্যবহারের উদাহরণ:
=>(চলুন [[সংগ্রহ{}]]
... (অ্যাসোক কালেকশন "কুকুর" "বার্ক")
... (মুদ্রণ সংগ্রহ))
{u'Dog': u'Bark'}
=>(চলুন [[সংগ্রহ{}]]
... (অ্যাসোক কালেকশন "কুকুর" "বার্ক" "বিড়াল" "মিও")
... (মুদ্রণ সংগ্রহ))
{u'Cat': u'Meow', u'dog': u'Bark'}
=>(চলুন [[সংগ্রহ [1 2 3 4]]]]
... (সহযোগী সংগ্রহ 2 কোনটিই নয়)
... (মুদ্রণ সংগ্রহ))
[১, ২, কোনোটিই নয়, ৪২]
লক্ষ্য করুন:
সহযোগিতা জায়গায় ডেটাস্ট্রাকচার পরিবর্তন করে এবং রিটার্ন করে না.
বিরতি
বিরতি একটি লুপ থেকে বিরতি ব্যবহার করা হয়. এটা অবিলম্বে লুপ বন্ধ. অনুসরণ
উদাহরণ একটি অসীম আছে যখন লুপ যা ব্যবহারকারী প্রবেশ করার সাথে সাথেই বন্ধ হয়ে যায় k.
(যদিও সত্য (যদি (= "কে" (কাঁচা-ইনপুট "? "))
(ব্রেক)
("আবার চেষ্টা করুন" প্রিন্ট করুন)))
Cond
Cond বাসা তৈরি করতে ব্যবহার করা যেতে পারে if বিবৃতি নিম্নলিখিত উদাহরণ দেখায়
ম্যাক্রো এবং এর সম্প্রসারণের মধ্যে সম্পর্ক:
(cond [শর্ত-1 ফলাফল-1]
[শর্ত-২ ফলাফল-২])
(যদি শর্ত-১ ফলাফল-১
(যদি শর্ত-২ ফলাফল-২))
নীচে দেখানো হিসাবে, শুধুমাত্র প্রথম ম্যাচিং ফলাফল ব্লক কার্যকর করা হয়.
=> (defn চেক-মান [মান]
... (cond [(< মান 5) (মুদ্রণ "মান 5 থেকে ছোট")]
... [(= মান 5) (প্রিন্ট "মান 5 এর সমান")]
... [(> মান 5) (মুদ্রণ "মান 5 এর চেয়ে বড়")]
... [সত্য (প্রিন্ট "মান এমন কিছু যা হওয়া উচিত নয়")]))
=> (চেক-মান 6)
মান 5 এর চেয়ে বেশি
অবিরত
অবিরত একটি লুপের শুরুতে মৃত্যুদন্ড প্রদান করে। নিম্নলিখিত উদাহরণে,
(পার্শ্ব-প্রতিক্রিয়া1) প্রতিটি পুনরাবৃত্তির জন্য বলা হয়। (পার্শ্ব-প্রতিক্রিয়া2), তবে, শুধুমাত্র বলা হয়
তালিকার প্রতিটি অন্য মান।
;; ধরে নিচ্ছি যে (সাইড-ইফেক্ট1) এবং (সাইড-ইফেক্ট2) হল ফাংশন এবং
;; সংগ্রহ হল সংখ্যাসূচক মানের একটি তালিকা
(এর জন্য [x সংগ্রহ]
(কর
(পার্শ্ব-প্রতিক্রিয়া1 x)
(যদি (% x 2)
(চালিয়ে যান))
(পার্শ্ব-প্রতিক্রিয়া2 x)))
dict-com
dict-com অভিধান তৈরি করতে ব্যবহৃত হয়। এটি তিন বা চার প্যারামিটার লাগে। প্রথম
দুটি পরামিতি রিটার্ন মান নিয়ন্ত্রণের জন্য (কী-মান জোড়া) যেখানে তৃতীয়টি
একটি ক্রম থেকে আইটেম নির্বাচন করতে ব্যবহৃত. চতুর্থ এবং ঐচ্ছিক প্যারামিটার ব্যবহার করা যেতে পারে
শর্তসাপেক্ষ অভিব্যক্তির উপর ভিত্তি করে অনুক্রমের কিছু আইটেম ফিল্টার করুন।
=> (dict-comp x (* x 2) [x (পরিসীমা 10)] (বিজোড়? x))
{1: 2, 3: 6, 9: 18, 5: 10, 7: 14}
do / progn
do এবং progn তাদের প্রতিটি যুক্তি মূল্যায়ন করতে এবং শেষটি ফেরত দিতে ব্যবহৃত হয়। প্রত্যাবর্তন
শেষ আর্গুমেন্ট ব্যতীত প্রতিটি থেকে মান বাতিল করা হয়। এটি ব্যবহার করা যেতে পারে ল্যামডা or
list-com নিম্নলিখিত উদাহরণগুলির একটিতে দেখানো হিসাবে আরও জটিল যুক্তি সঞ্চালন করতে।
কিছু উদাহরণ ব্যবহার:
=> (যদি সত্য
... (করুন (মুদ্রণ করুন "পার্শ্ব প্রতিক্রিয়া রক!")
... (প্রিন্ট "হ্যাঁ, সত্যিই!")))
পার্শ্বপ্রতিক্রিয়া শিলা!
হাঁ সত্যিই!
;; ধরে নিচ্ছি যে (পার্শ্ব-প্রতিক্রিয়া) একটি ফাংশন যা আমরা প্রতিটির জন্য কল করতে চাই
;; এবং তালিকার প্রতিটি মান, কিন্তু যার রিটার্ন মান আমরা চিন্তা করি না
=> (তালিকা-কম্প (করুন (পার্শ্ব-প্রতিক্রিয়া x)
... (যদি (< x 5) (* 2 x)
... (*4 x)))
... (x (পরিসীমা 10)))
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
do 1 থেকে n পর্যন্ত যেকোনো সংখ্যক আর্গুমেন্ট গ্রহণ করতে পারে।
Def / সেটভি
Def এবং সেটভি একটি মান, বস্তু, বা ফাংশন একটি প্রতীকে আবদ্ধ করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ:
=> (ডেফ নাম ["এলিস" "বব" "চার্লি"])
=> (নাম মুদ্রণ)
[u'Alice', u'Bob', u'Charlie']
=> (setv কাউন্টার (fn [সংগ্রহ আইটেম] (.গণনা সংগ্রহ আইটেম)))
=> (কাউন্টার [1 2 3 4 5 2 3] 2)
2
defclass
সাথে নতুন ক্লাস ঘোষণা করা হয় defclass. এটি দুটি ঐচ্ছিক পরামিতি নিতে পারে: একটি ভেক্টর
একটি সম্ভাব্য সুপার ক্লাস এবং নতুনের বৈশিষ্ট্য ধারণকারী আরেকটি ভেক্টর সংজ্ঞায়িত করা
দুটি আইটেম ভেক্টর হিসাবে শ্রেণী।
(ডিফক্লাস ক্লাস-নাম [সুপার-ক্লাস-1 সুপার-ক্লাস-2]
[[অ্যাট্রিবিউট মান]])
মান এবং ফাংশন উভয়ই নতুন ক্লাসে আবদ্ধ হতে পারে যেমনটি নীচের উদাহরণ দ্বারা দেখানো হয়েছে:
=> (ডিফক্লাস বিড়াল []
... [[বয়স নেই]
... [রঙ "সাদা"]
... [বলুন (fn [স্বয়ং] (প্রিন্ট "মিও"))]])
=> (ডিফ স্পট (বিড়াল))
=> (setv spot.colour "কালো")
'কালো'
=> (.স্পিক স্পট)
মিউ
defn / defun
defn এবং defun ম্যাক্রো ফাংশন সংজ্ঞায়িত করতে ব্যবহৃত হয়। তারা তিনটি পরামিতি গ্রহণ করে: নাম
সংজ্ঞায়িত করার জন্য ফাংশনটির একটি ভেক্টর পরামিতি, এবং শরীর ফাংশনের:
(defn name [params] body)
পরামিতিগুলির সামনে নিম্নলিখিত কীওয়ার্ড থাকতে পারে:
&ঐচ্ছিক
পরামিতি ঐচ্ছিক। পরামিতি একটি দুটি আইটেম তালিকা হিসাবে দেওয়া যেতে পারে, যেখানে
প্রথম উপাদানটি প্যারামিটারের নাম এবং দ্বিতীয়টি ডিফল্ট মান। প্যারামিটার
একটি একক আইটেম হিসাবেও দেওয়া যেতে পারে, যে ক্ষেত্রে ডিফল্ট মান না.
=> (defn মোট-মান [মান ও ঐচ্ছিক [মান-সংযোজিত-কর 10]]
... (+ (/ (* মান মান-সংযোজিত-কর) 100) মান))
=> (মোট-মান 100)
110.0
=> (মোট-মান 100 1)
101.0
&চাবি
&kwargs
প্যারামিটারে 0 বা তার বেশি কীওয়ার্ড আর্গুমেন্ট থাকবে।
নিম্নলিখিত কোড উদাহরণগুলি একটি ফাংশন সংজ্ঞায়িত করে যা সমস্ত কীওয়ার্ড প্রিন্ট করবে
যুক্তি এবং তাদের মান।
=> (defn প্রিন্ট-প্যারামিটার [&kwargs kwargs]
... (এর জন্য [(, k v) (.items kwargs)] (প্রিন্ট k v)))
=> (প্রিন্ট-প্যারামিটার প্রয়োগ করুন [] {"প্যারামিটার-1" 1 "প্যারামিটার-2" 2})
প্যারামিটার-2 2
প্যারামিটার-1 1
&বিশ্রাম প্যারামিটারে 0 বা তার বেশি অবস্থানগত আর্গুমেন্ট থাকবে। অন্য কোন অবস্থানগত
আর্গুমেন্ট এই এক পরে নির্দিষ্ট করা যেতে পারে.
নিম্নলিখিত কোড উদাহরণ একটি ফাংশন সংজ্ঞায়িত করে যা 0 থেকে n সংখ্যাসূচক দেওয়া যেতে পারে
পরামিতি এটি তারপর প্রতিটি বিজোড় সংখ্যা যোগ করে এবং প্রতিটি জোড় সংখ্যা বিয়োগ করে।
=> (defn zig-zag-sum [&বাকি সংখ্যা]
(আলো [[বিজোড়-সংখ্যা (তালিকা-কম্প x [x সংখ্যা] (বিজোড়? x))]]
[জোর-সংখ্যা (তালিকা-কম্প x [x সংখ্যা] (এমন? x))]]
(- (জোড়-বিজোড়-সংখ্যা) (জোড়-সংখ্যা))))
=> (জিগ-জ্যাগ-সম)
0
=> (zig-zag-sum 3 9 4)
8
=> (zig-zag-sum 1 2 3 4 5 6)
-3
defn- alias / defun- alias
0.10.0 সংস্করণে নতুন।
সার্জারির defn- alias এবং defun- alias ম্যাক্রো অনেকটা এরকম defn, পার্থক্য সঙ্গে যে
একটি একক নামের সাথে একটি ফাংশন সংজ্ঞায়িত করার পরিবর্তে, এগুলি উপনামগুলিও সংজ্ঞায়িত করতে পারে। অন্যান্য
প্রথম প্যারামিটার হিসাবে ফাংশন নামের জন্য প্রতীকগুলির একটি তালিকা নেওয়ার চেয়ে, defn- alias এবং
defun- alias থেকে আলাদা নয় defn এবং defun.
=> (defn-alias [main-name alias] []
... (প্রিন্ট "হ্যালো!"))
=> (প্রধান নাম)
"হ্যালো!"
=> (ওরফে)
"হ্যালো!"
defmain
0.10.1 সংস্করণে নতুন।
সার্জারির defmain ম্যাক্রো একটি প্রধান ফাংশন সংজ্ঞায়িত করে যা অবিলম্বে কল করা হয় sys.argv as
আর্গুমেন্ট যদি এবং শুধুমাত্র যদি এই ফাইলটি একটি স্ক্রিপ্ট হিসাবে চালানো হচ্ছে। অন্য কথায়, এই:
(defmain [&rest args]
(আর্গস দিয়ে কিছু করুন))
এর সমতুল্য:
def main(*args):
do_something_with(args)
এক্সএনএমএক্স ফিরে আসুন
যদি __নাম__ == "__প্রধান__":
আমদানি sys
retval = প্রধান (*sys.arg)
যদি instance (retval, int):
sys.exit(retval)
মনে রাখবেন যে আপনি উপরে দেখতে পাচ্ছেন, যদি আপনি এই ফাংশন থেকে একটি পূর্ণসংখ্যা ফেরত দেন তবে এটি হবে
আপনার স্ক্রিপ্টের জন্য প্রস্থান অবস্থা হিসাবে ব্যবহৃত হয়। (অন্যথায় স্ট্যাটাস 0 থেকে প্রস্থান করতে পাইথন ডিফল্ট,
যার মানে সবকিছু ঠিক আছে!)
(থেকে (sys.exit 0) থেকে একটি নন-ইনটিজার রিটার্নের ক্ষেত্রে স্পষ্টভাবে চালানো হয় না
defmain, এটা রাখা একটি ভাল ধারণা (নির্ধারিত) আপনার ফাইলের কোডের শেষ অংশ হিসাবে।)
ডিফম্যাক্রো
ডিফম্যাক্রো ম্যাক্রো সংজ্ঞায়িত করতে ব্যবহৃত হয়। সাধারণ বিন্যাস হল (ডিফম্যাক্রো নাম [পরামিতি]
এক্সপ্র).
নিম্নলিখিত উদাহরণটি একটি ম্যাক্রোকে সংজ্ঞায়িত করে যা কোডে উপাদানগুলির ক্রম অদলবদল করতে ব্যবহার করা যেতে পারে,
ব্যবহারকারীকে ইনফিক্স নোটেশনে কোড লেখার অনুমতি দেয়, যেখানে অপারেটর এর মধ্যে থাকে
অপারেন্ড
=> (ডিফম্যাক্রো ইনফিক্স [কোড]
... (আধাউদ্ধৃতি (
... (উদ্ধৃতি উদ্ধৃত করুন (কোড 1 পান))
... (উদ্ধৃতি উদ্ধৃত করুন (কোড 0 পান))
... (উদ্ধৃতি উদ্ধৃত করুন (কোড 2 পান)))))
=> (ইনফিক্স (1 + 1))
2
ডিফম্যাক্রো-উনাফে
ডিফম্যাক্রো-উনাফে একাধিক নাম (উনামে) সহ ম্যাক্রো সংজ্ঞায়িত করতে ব্যবহৃত হয়। সাধারণ বিন্যাস
is (defmacro-alias [নাম] [পরামিতি] এক্সপ্র). এটি একই সাথে একাধিক ম্যাক্রো তৈরি করে
প্যারামিটার তালিকা এবং বডি, নামের নির্দিষ্ট তালিকার অধীনে।
নিম্নলিখিত উদাহরণ দুটি ম্যাক্রো সংজ্ঞায়িত করে, উভয়ই ব্যবহারকারীকে কোড লিখতে দেয়
infix স্বরলিপি।
=> (defmacro-alias [infix infi] [কোড]
... (আধাউদ্ধৃতি (
... (উদ্ধৃতি উদ্ধৃত করুন (কোড 1 পান))
... (উদ্ধৃতি উদ্ধৃত করুন (কোড 0 পান))
... (উদ্ধৃতি উদ্ধৃত করুন (কোড 2 পান)))))
=> (ইনফিক্স (1 + 1))
2
=> (ইনফি (1 + 1))
2
ডিফম্যাক্রো/জি!
0.9.12 সংস্করণে নতুন।
ডিফম্যাক্রো/জি! এর একটি বিশেষ সংস্করণ ডিফম্যাক্রো যা স্বয়ংক্রিয়ভাবে তৈরি করতে ব্যবহৃত হয় gensym
যে কোনো চিহ্ন দিয়ে শুরু হয় g!.
উদাহরণ স্বরূপ, g!a হবে (জেনসিম "ক").
SEE এছাড়াও:
জেনসিম ব্যবহার করে বিভাগ
ডিফ্রিডার
0.9.12 সংস্করণে নতুন।
ডিফ্রিডার একটি পাঠক ম্যাক্রো সংজ্ঞায়িত করে, আপনাকে সিনট্যাক্স পুনর্গঠন বা সংশোধন করতে সক্ষম করে।
=> (ডিফ্রিডার ^ [এক্সপিআর] (প্রিন্ট এক্সপ্র))
=> #^(1 2 3 4)
(1)
=> #^"হ্যালো"
"হ্যালো"
SEE এছাড়াও:
সেকশন রিডার ম্যাক্রো
এর
0.9.12 সংস্করণে নতুন।
এর বর্তমান নামস্থান থেকে একটি বস্তু সরিয়ে দেয়।
=> (setv foo 42)
=> (ডেল ফু)
=> foo
ট্রেসব্যাক (সবচেয়ে সাম্প্রতিকতম কল সর্বশেষ):
ফাইল "", লাইন 1, -এ
NameError: নাম 'foo' সংজ্ঞায়িত করা হয়নি
এর ম্যাপিং, তালিকা এবং আরও অনেক কিছু থেকে অবজেক্ট অপসারণ করতে পারে।
=> (সেটিভি পরীক্ষা (তালিকা (পরিসীমা 10)))
=> পরীক্ষা
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
=> (ডেল (স্লাইস টেস্ট 2 4));; 2 থেকে 4 বাদ দেওয়া আইটেমগুলি সরান
=> পরীক্ষা
[০, ১, ৪, ৫, ৬, ৭, ৮, ৯]
=> (setv dic {"foo" "বার"})
=> ডিসি
{"foo": "বার"}
=> (ডেল (ডিক "ফু" পান))
=> ডিসি
{}
প্রতিভাধর
0.10.1 সংস্করণে নতুন।
প্রতিভাধর একটি বস্তুতে পদ্ধতি কলের একটি ক্রম সরল করতে ব্যবহৃত হয়।
=> (ডোটো [] (.সংযোজন 1) (.সংযোজন 2) .বিপরীত)
[2 1]
=> (সেটিভি সংগ্রহ [])
=> (.সংগ্রহ 1 সংযোজন)
=> (.সংগ্রহ 2 সংযোজন)
=> (. বিপরীত সংগ্রহ)
=> সংগ্রহ
[2 1]
স্পষ্ট
স্পষ্ট একটি উদ্ধৃত অভিব্যক্তি মূল্যায়ন করে এবং মান প্রদান করে।
=> (eval '("হ্যালো ওয়ার্ল্ড" মুদ্রণ))
"ওহে বিশ্ব"
eval-এবং-কম্পাইল
eval-when-কম্পাইল
প্রথম / গাড়ী
প্রথম এবং গাড়ী একটি সংগ্রহের প্রথম উপাদান অ্যাক্সেস করার জন্য ম্যাক্রো:
=> (প্রথম (পরিসীমা 10))
0
উন্নত
উন্নত একটি তালিকা বা ভেক্টরের প্রতিটি উপাদানের জন্য একটি ফাংশন কল করতে ব্যবহৃত হয়। প্রতিটির ফলাফল
কল বাতিল করা হয় এবং উন্নত অভিব্যক্তি ফিরে আসে না পরিবর্তে. উদাহরণ কোড পুনরাবৃত্তি
শেষ সংগ্রহ এবং প্রত্যেকের জন্য উপাদান in সংগ্রহ কল পার্শ্ব প্রতিক্রিয়া সঙ্গে ফাংশন
উপাদান তার যুক্তি হিসাবে:
;; ধরে নিচ্ছি যে (পার্শ্ব-প্রতিক্রিয়া) একটি ফাংশন যা একটি একক প্যারামিটার নেয়
(এর জন্য [উপাদান সংগ্রহ] (পার্শ্ব-প্রতিক্রিয়া উপাদান))
;; জন্য একটি ঐচ্ছিক অন্য ব্লক থাকতে পারে
(এর জন্য [উপাদান সংগ্রহ] (পার্শ্ব-প্রতিক্রিয়া উপাদান)
(অন্য (পার্শ্ব-প্রতিক্রিয়া-2)))
.চ্ছিক আর ব্লক শুধুমাত্র কার্যকর করা হয় যদি উন্নত লুপ স্বাভাবিকভাবে শেষ হয়। যদি
সঙ্গে মৃত্যুদণ্ড স্থগিত বিরতি, দ্য আর ব্লক চালানো হয় না।
=> (এর জন্য [উপাদান [1 2 3]] (যদি (< উপাদান 3)
... (মুদ্রণ উপাদান)
... (বিরতি))
... (অন্যথায় (মুদ্রণ "লুপ সমাপ্ত")))
1
2
=> (এর জন্য [উপাদান [1 2 3]] (যদি (< উপাদান 4)
... (মুদ্রণ উপাদান)
... (বিরতি))
... (অন্যথায় (মুদ্রণ "লুপ সমাপ্ত")))
1
2
3
লুপ শেষ
genexpr
genexpr জেনারেটর এক্সপ্রেশন তৈরি করতে ব্যবহৃত হয়। এটি দুই বা তিনটি পরামিতি লাগে। দ্য
প্রথম প্যারামিটারটি রিটার্ন মান নিয়ন্ত্রণকারী অভিব্যক্তি, যখন দ্বিতীয়টি ব্যবহৃত হয়
একটি তালিকা থেকে আইটেম নির্বাচন করতে। তৃতীয় এবং ঐচ্ছিক পরামিতি ফিল্টার আউট ব্যবহার করা যেতে পারে
শর্তসাপেক্ষ অভিব্যক্তির উপর ভিত্তি করে তালিকার কিছু আইটেম। genexpr অনুরূপ
list-com, ব্যতীত এটি একটি পুনরাবৃত্তিযোগ্য প্রদান করে যা এর পরিবর্তে একের পর এক মান মূল্যায়ন করে
অবিলম্বে তাদের মূল্যায়ন।
=> (ডিএফ সংগ্রহ (পরিসীমা 10))
=> (def ফিল্টার করা (genexpr x [x সংগ্রহ] (এমনকি? x)))
=> (তালিকা ফিল্টার করা হয়েছে)
[১, ৪, ৫,,, ৯]
gensym
0.9.12 সংস্করণে নতুন।
gensym একটি অনন্য চিহ্ন তৈরি করতে ব্যবহৃত হয় যা ম্যাক্রো ছাড়াই লেখার অনুমতি দেয়
আকস্মিক পরিবর্তনশীল নামের সংঘর্ষ।
=> (জেনসিম)
u':G_1235'
=> (জেনসিম "x")
u':x_1236'
SEE এছাড়াও:
জেনসিম ব্যবহার করে বিভাগ
পাওয়া
পাওয়া তালিকা এবং অভিধানে একক উপাদান অ্যাক্সেস করতে ব্যবহৃত হয়। পাওয়া দুটি পরামিতি লাগে:
দ্য উপাত্ত গঠন এবং শীর্ষ XNUMX গ্লোবাল HR এক্সিলেন্স অ্যাওয়ার্ডের সূচক or চাবি আইটেমটির এটি তারপর সংশ্লিষ্ট ফেরত দেবে
অভিধান বা তালিকা থেকে মান। উদাহরণ ব্যবহার:
=> ([[প্রাণী {"কুকুর" "ঘেলা" "বিড়াল" "মিও"}]
... [সংখ্যা ["শূন্য" "এক" "দুই" "তিন"]]]
... (মুদ্রণ (প্রাণী "কুকুর" পান))
... (মুদ্রণ (সংখ্যা 2 পান)))
বাকল
দুই
লক্ষ্য করুন:
পাওয়া একটি অ-বিদ্যমান কী জন্য অভিধান অনুসন্ধান করা হলে একটি KeyError উত্থাপন করে।
লক্ষ্য করুন:
পাওয়া একটি সূচক ত্রুটি উত্থাপন করে যদি একটি তালিকা বা একটি টিপল একটি সূচকের জন্য জিজ্ঞাসা করা হয় যা
সীমানা
বিশ্বব্যাপী
বিশ্বব্যাপী একটি প্রতীককে বিশ্বব্যাপী হিসাবে চিহ্নিত করতে ব্যবহার করা যেতে পারে। এটি প্রোগ্রামারকে একটি বরাদ্দ করতে দেয়
একটি বৈশ্বিক প্রতীকের মান। একটি বিশ্বব্যাপী প্রতীক পড়ার প্রয়োজন নেই বিশ্বব্যাপী কীওয়ার্ড --
শুধুমাত্র এটি বরাদ্দ করা হয়.
নিম্নলিখিত উদাহরণ দেখায় কিভাবে বিশ্ব প্রতীক a একটি ফাংশনে একটি মান নির্ধারণ করা হয় এবং
পরে অন্য ফাংশনে মুদ্রিত হয়। ছাড়া বিশ্বব্যাপী কীওয়ার্ড, দ্বিতীয় ফাংশন
একটি নিক্ষেপ করা হবে নাম ত্রুটি.
(defn set-a [value]
(গ্লোবাল ক)
(একটি মান সেট করুন))
(defn print-a []
(প্রিন্ট ক))
(সেট-a 5)
(প্রিন্ট-ক)
if / যদি না
0.10.0 সংস্করণে নতুন: যদি না হয়
if শর্তসাপেক্ষে কার্যকর করার জন্য কোড নির্বাচন করতে ব্যবহৃত হয়। এটি একটি শর্ত ধারণ করা আবশ্যক
ব্লক এবং ব্লক কার্যকর করা হবে যদি শর্ত ব্লক মূল্যায়ন করে সত্য. ঐচ্ছিকভাবে,
এটিতে একটি চূড়ান্ত ব্লক থাকতে পারে যা শর্তের মূল্যায়নের ক্ষেত্রে কার্যকর করা হয়
মিথ্যা.
যদি না অনুরূপ, কিন্তু দ্বিতীয় ব্লক কার্যকর করা হবে যখন শর্ত ব্যর্থ হয় যখন
তৃতীয় এবং চূড়ান্ত ব্লকটি কার্যকর করা হয় যখন পরীক্ষা সফল হয় -- এর বিপরীত ক্রম if.
উদাহরণ ব্যবহার:
(যদি (টাকা বাকি? অ্যাকাউন্ট)
("চলো কেনাকাটা করি" প্রিন্ট করুন)
("চল যাই এবং কাজ করি" প্রিন্ট করি))
(যদি-না হয় (টাকা বাকি? অ্যাকাউন্ট)
("চল যাই এবং কাজ করি" প্রিন্ট করুন)
("চলো কেনাকাটা করি" প্রিন্ট করুন))
পাইথন সত্যতাকে সম্মান করা হয়। না, মিথ্যা, যেকোনো সংখ্যাসূচক ধরনের শূন্য, একটি খালি ক্রম,
এবং একটি খালি অভিধান বিবেচনা করা হয় মিথ্যা; বাকি সবকিছু বিবেচনা করা হয় সত্য.
lisp-যদি / তন্তু এবং lisp-যদি-না / lif-না
0.10.0 সংস্করণে নতুন।
0.10.2 সংস্করণে নতুন: lisp-if-not / lif-not
যারা আরো লিস্পি পছন্দ করেন তাদের জন্য if ধারা, আমরা আছে lisp-যদি, বা তন্তু. এই কেবল বিবেচনা করে
না / শূন্য মিথ্যা হতে! অন্যান্য সমস্ত "মিথ্যা-ইশ" পাইথন মান সত্য বলে বিবেচিত হয়।
বিপরীতভাবে, আমরা আছে lisp-যদি-না এবং lif-না সমান্তরালভাবে if এবং যদি না যা বিপরীত হয়
তুলনা.
=> (লিস্প-যদি সত্য "সত্য" "মিথ্যা")
"সত্য"
=> (লিস্প-যদি মিথ্যা "সত্য" "মিথ্যা")
"সত্য"
=> (লিস্প-যদি 0 "সত্য" "মিথ্যা")
"সত্য"
=> (লিস্প-যদি নেই "সত্য" "মিথ্যা")
"মিথ্যা"
=> (লিস্প-যদি কোনটিই "সত্য" "মিথ্যা")
"মিথ্যা"
=> (লিস্প-যদি-নিল "সত্য" "মিথ্যা")
"সত্য"
=> (লিস্প-যদি-না হয় "সত্য" "মিথ্যা")
"সত্য"
=> (লিস্প-যদি-মিথ্যা নয় "সত্য" "মিথ্যা")
"মিথ্যা"
; সমতুল্য কিন্তু খাটো
=> (যদি সত্য "সত্য" "মিথ্যা")
"সত্য"
=> (যদি "সত্য" "মিথ্যা" নেই)
"মিথ্যা"
=> (life-None None "সত্য" "মিথ্যা")
"সত্য"
আমদানি
আমদানি পাইথনের মতো মডিউল আমদানি করতে ব্যবহৃত হয়। যে বিভিন্ন উপায় আছে আমদানি পারেন
ব্যবহার করা.
;; এই মডিউলগুলির প্রতিটি আমদানি করে
;;
;; পাইথন:
;; আমদানি sys
;; os.path আমদানি করুন
(sys os.path আমদানি করুন)
;; একটি মডিউল থেকে আমদানি করুন
;;
;; Python: os.path থেকে আমদানি বিদ্যমান, isdir, isfile
(আমদানি [os.path [বিদ্যমান isdir isfile]])
;; একটি উপনাম দিয়ে আমদানি করুন৷
;;
;; পাইথন: সিস্টেস্ট হিসাবে sys আমদানি করুন
(আমদানি [sys: as systest])
;; আপনি বিভিন্ন ধরনের আপনার পছন্দ হিসাবে অনেক আমদানি তালিকাভুক্ত করতে পারেন.
(আমদানি [tests.resources [kwtest function-with-a-dash]]
[os.path [isdir isfile বিদ্যমান]]
[sys : as systest])
;; বর্তমান নামস্থানে সমস্ত মডিউল ফাংশন আমদানি করুন
(আমদানি [sys [*]])
ল্যামডা / fn
ল্যামডা এবং fn একটি বেনামী ফাংশন সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে। পরামিতি অনুরূপ
defn: প্রথম প্যারামিটারটি প্যারামিটারের ভেক্টর এবং বাকিটি হল এর বডি
ফাংশন. ল্যামডা একটি নতুন ফাংশন প্রদান করে। নিম্নলিখিত উদাহরণে, একটি বেনামী ফাংশন
আউটপুট ফিল্টার করার জন্য সংজ্ঞায়িত এবং অন্য ফাংশনে প্রেরণ করা হয়।
=> (জনগণ [{:নাম "এলিস" : বয়স 20}
... {:নাম "বব" : বয়স 25}
... {:নাম "চার্লি" : বয়স ৫০}
... {:নাম "ডেভ" : বয়স ৫}])
=> (defn display-people [people filter]
... ([ব্যক্তি মানুষের জন্য] (যদি (ব্যক্তি ফিল্টার) (প্রিন্ট (:নাম ব্যক্তি)))))
=> (প্রদর্শনকারী মানুষ (fn [ব্যক্তি] (< (:বয়স ব্যক্তি) 25)))
এলিস
ডেভ
ঠিক যেমন স্বাভাবিক ফাংশন সংজ্ঞা, যদি শরীরের প্রথম উপাদান একটি স্ট্রিং হয়, এটি
একটি ডকস্ট্রিং হিসাবে কাজ করে। এটি ক্লাস পদ্ধতি ডকস্ট্রিং দেওয়ার জন্য দরকারী।
=> (সেটিভি বার-তিন
... (fn [x]
... "ইনপুটকে তিন দ্বারা গুণ করে এবং ফলাফল প্রদান করে।"
... (* x 3)))
এটি পাইথনের অন্তর্নির্মিত মাধ্যমে নিশ্চিত করা যেতে পারে সাহায্য ফাংশন:
=> (সাহায্য বার-তিন)
ফাংশন টাইম_থ্রিতে সহায়তা:
বার_তিন(x)
ইনপুটকে তিন দ্বারা গুণ করে এবং ফলাফল প্রদান করে
(শেষ)
গত
0.10.2 সংস্করণে নতুন।
গত একটি সংগ্রহের শেষ উপাদান অ্যাক্সেস করার জন্য ব্যবহার করা যেতে পারে:
=> (শেষ [২ ৪ ৬])
6
দিন
দিন আভিধানিকভাবে স্কোপড ভেরিয়েবল তৈরি করতে ব্যবহৃত হয়। এগুলোর শুরুতে তৈরি হয়
দিন ফর্ম এবং ফর্ম পরে অস্তিত্ব বন্ধ. নিম্নলিখিত উদাহরণ এটি দেখায়
আচরণ:
=> (চলুন [[x 5]] (x প্রিন্ট করুন)
... (চলুন [[x 6]] (প্রিন্ট x))
... (প্রিন্ট x))
5
6
5
সার্জারির দিন ম্যাক্রো দুটি পরামিতি নেয়: একটি ভেক্টর সংজ্ঞায়িত ভেরিয়েবল এবং শীর্ষ XNUMX গ্লোবাল HR এক্সিলেন্স অ্যাওয়ার্ডের শরীর যা পায়
নিষ্পন্ন. ভেরিয়েবল একটি ভেক্টর যেখানে প্রতিটি উপাদান হয় একটি একক পরিবর্তনশীল বা একটি ভেক্টর
একটি পরিবর্তনশীল মান জোড়া সংজ্ঞায়িত করা। একটি একক চলকের ক্ষেত্রে, এটি নির্ধারিত মান
না; অন্যথায়, সরবরাহকৃত মান ব্যবহার করা হয়।
=> (আলো [x [y 5]] (প্রিন্ট x y))
কোনটিই 5
list-com
list-com তালিকা বোঝার কাজ করে। এটি দুই বা তিনটি পরামিতি লাগে। প্রথম
পরামিতি হল অভিব্যক্তি যা রিটার্ন মান নিয়ন্ত্রণ করে, যখন দ্বিতীয়টি ব্যবহৃত হয়
একটি তালিকা থেকে আইটেম নির্বাচন করুন। তৃতীয় এবং ঐচ্ছিক প্যারামিটারটি কিছু ফিল্টার করতে ব্যবহার করা যেতে পারে
একটি শর্তসাপেক্ষ অভিব্যক্তির উপর ভিত্তি করে তালিকার আইটেমগুলির। কিছু উদাহরণ:
=> (ডিএফ সংগ্রহ (পরিসীমা 10))
=> (তালিকা-কম্প x [x সংগ্রহ])
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
=> (তালিকা-কম্প (* x 2) [x সংগ্রহ])
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
=> (তালিকা-কম্পন (* x 2) [x সংগ্রহ] (< x 5))
[১, ৪, ৫,,, ৯]
না
না যৌক্তিক অভিব্যক্তিতে ব্যবহৃত হয়। এটি একটি একক প্যারামিটার নেয় এবং একটি বিপরীত ফেরত দেয়
সত্য মান যদি সত্য একটি প্যারামিটার হিসাবে দেওয়া হয়, মিথ্যা ফেরত দেওয়া হবে, এবং তদ্বিপরীত।
উদাহরণ ব্যবহার:
=> (সত্য নয়)
মিথ্যা
=> (মিথ্যা নয়)
সত্য
=> (কোনটি নয়)
সত্য
or
or যৌক্তিক অভিব্যক্তিতে ব্যবহৃত হয়। এটি কমপক্ষে দুটি পরামিতি লাগে। এটি ফেরত দেবে
প্রথম অ মিথ্যা পরামিতি। যদি এই ধরনের কোনো মান বিদ্যমান না থাকে, তাহলে শেষ প্যারামিটারটি ফেরত দেওয়া হবে।
=> (বা সত্য মিথ্যা)
সত্য
=> (এবং মিথ্যা মিথ্যা)
মিথ্যা
=> (এবং মিথ্যা 1 সত্য মিথ্যা)
1
লক্ষ্য করুন:
or শর্ট-সার্কিট এবং প্রথম সত্য মান হওয়ার সাথে সাথে পরামিতিগুলি মূল্যায়ন করা বন্ধ করে দেয়
সম্মুখীন।
=> (বা সত্য ("হ্যালো" মুদ্রণ))
সত্য
ছাপানো
ছাপানো পর্দায় আউটপুট ব্যবহার করা হয়. উদাহরণ ব্যবহার:
("হ্যালো ওয়ার্ল্ড" মুদ্রণ করুন!)
লক্ষ্য করুন:
ছাপানো সবসময় ফিরে আসে না.
quasiquote
quasiquote আপনাকে একটি ফর্ম উদ্ধৃত করার অনুমতি দেয়, কিন্তু নির্বাচনীভাবে অভিব্যক্তি মূল্যায়ন করতে দেয়।
ভিতরে অভিব্যক্তি a quasiquote ব্যবহার করে বেছে বেছে মূল্যায়ন করা যেতে পারে উদ্ধতি শেষ করা (~)। দ্য
মূল্যায়ন করা ফর্ম ব্যবহার করে spliced করা যেতে পারে unquote- splice (~@) Quasiquoteও হতে পারে
ব্যাককোট ব্যবহার করে লেখা (`) প্রতীক।
;; যাক 'qux' মান সহ একটি পরিবর্তনশীল (বার বাজ)
`(foo ~qux)
; '(foo (বার বাজ)) এর সমতুল্য
`(foo ~@qux)
; '(ফু বার বাজ) এর সমতুল্য
উদ্ধৃতি
উদ্ধৃতি এটিকে মূল্যায়ন না করেই পাস করা ফর্মটি ফেরত দেয়। উদ্ধৃতি বিকল্পভাবে হতে পারে
apostrophe ব্যবহার করে লেখা (') প্রতীক।
=> (setv x '("হ্যালো ওয়ার্ল্ড" মুদ্রণ))
; পরিবর্তনশীল x এক্সপ্রেশনে সেট করা হয়েছে এবং মূল্যায়ন করা হয়নি
=> x
(u'print' u'Hello World')
=> (ইভাল এক্স)
হ্যালো ওয়ার্ল্ড
প্রয়োজন
প্রয়োজন একটি প্রদত্ত মডিউল থেকে ম্যাক্রো আমদানি করতে ব্যবহৃত হয়। এটি কমপক্ষে একটি প্যারামিটার লাগে
কোন ম্যাক্রো আমদানি করা উচিত মডিউলটি নির্দিষ্ট করা। একাধিক মডিউল আমদানি করা যেতে পারে
একক সঙ্গে প্রয়োজন.
নিম্নলিখিত উদাহরণ থেকে ম্যাক্রো আমদানি করা হবে মডিউল 1 এবং মডিউল 2:
(মডিউল-১ মডিউল-২ প্রয়োজন)
বিশ্রাম / CDR
বিশ্রাম এবং CDR প্রথম উপাদান ছাড়াই একটি যুক্তি হিসাবে পাস করা সংগ্রহটি ফেরত দিন:
=> (বিশ্রাম (পরিসীমা 10))
[১, ২, ৩, ৪, ৫, ৬, ৭, ৮, ৯]
সেট-কম্প
সেট-কম্প সেট তৈরি করতে ব্যবহৃত হয়। এটি দুই বা তিনটি পরামিতি লাগে। প্রথম প্যারামিটার হল
রিটার্ন মান নিয়ন্ত্রণের জন্য, দ্বিতীয়টি একটি থেকে আইটেম নির্বাচন করতে ব্যবহৃত হয়
ক্রম. তৃতীয় এবং ঐচ্ছিক প্যারামিটারটি কিছু আইটেম ফিল্টার করতে ব্যবহার করা যেতে পারে
একটি শর্তাধীন অভিব্যক্তির উপর ভিত্তি করে ক্রম।
=> (setv ডেটা [1 2 3 4 5 2 3 4 5 3 4 5])
=> (সেট-কম্প x [x ডেটা] (বিজোড়? x))
{1, 3, 5}
ফালি
ফালি একটি তালিকার একটি উপসেট নিতে এবং এটি থেকে একটি নতুন তালিকা তৈরি করতে ব্যবহার করা যেতে পারে। ফর্ম
তালিকাটি স্লাইস করতে অন্তত একটি প্যারামিটার লাগে। দুটি ঐচ্ছিক পরামিতি হতে পারে
উপসেটের শুরু এবং শেষ অবস্থান দিতে ব্যবহৃত হয়। যদি তারা সরবরাহ করা না হয়,
এর ডিফল্ট মান না পরিবর্তে ব্যবহার করা হবে। তৃতীয় ঐচ্ছিক পরামিতি ব্যবহার করা হয়
উপাদানগুলির মধ্যে নিয়ন্ত্রণ পদক্ষেপ।
ফালি এর পাইথন প্রতিরূপ হিসাবে একই নিয়ম অনুসরণ করে। নেতিবাচক সূচক গণনা করা হয়
তালিকার শেষ থেকে শুরু। কিছু উদাহরণ ব্যবহার:
=> (ডিএফ সংগ্রহ (পরিসীমা 10))
=> (স্লাইস সংগ্রহ)
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
=> (স্লাইস সংগ্রহ 5)
[১, ৪, ৫,,, ৯]
=> (স্লাইস সংগ্রহ 2 8)
[০, ১, ১, ২, ৩, ৫]
=> (স্লাইস সংগ্রহ 2 8 2)
[2, 4, 6]
=> (স্লাইস সংগ্রহ -4 -2)
[6, 7]
নিক্ষেপ / বৃদ্ধি
সার্জারির নিক্ষেপ or বৃদ্ধি ফর্ম একটি বাড়াতে ব্যবহার করা যেতে পারে ব্যতিক্রম রানটাইমে উদাহরণ ব্যবহার:
(নিক্ষেপ)
; শেষ ব্যতিক্রম পুনরায় বাড়ান
(IOError নিক্ষেপ করুন)
; একটি IOError নিক্ষেপ করুন
(নিক্ষেপ (IOError "foobar"))
; একটি IOError নিক্ষেপ করুন ("foobar")
নিক্ষেপ একটি একক যুক্তি গ্রহণ করতে পারে (একটি ব্যতিক্রম ক্লাস বা উদাহরণ) বা কোন যুক্তি নেই
শেষ পুনরায় বাড়াতে ব্যতিক্রম.
চেষ্টা
সার্জারির চেষ্টা ফর্মটি শুরু করতে ব্যবহৃত হয় চেষ্টা / দঙ্গল ব্লক ফর্মটি নিম্নরূপ ব্যবহার করা হয়:
(চেষ্টা করুন
(ত্রুটি-প্রবণ-ফাংশন)
(catch [e ZeroDivisionError] ("শূন্য দ্বারা বিভাগ" মুদ্রণ))
(অন্যথায় (প্রিন্ট "কোন ত্রুটি নেই"))
(অবশেষে ("সব সম্পন্ন" মুদ্রণ)))
চেষ্টা অন্তত একটি থাকতে হবে দঙ্গল ব্লক, এবং ঐচ্ছিকভাবে একটি অন্তর্ভুক্ত করতে পারে আর or পরিশেষে
ব্লক যদি কার্যকর করার সময় একটি ম্যাচিং ক্যাচ ব্লকের সাথে একটি ত্রুটি উত্থাপিত হয়
ত্রুটি-প্রবণ-ফাংশন, যে দঙ্গল ব্লক কার্যকর করা হবে। যদি কোন ত্রুটি উত্থাপিত হয়, আর
ব্লক কার্যকর করা হয়। দ্য পরিশেষে একটি নির্বিশেষে ব্লক শেষ কার্যকর করা হবে বা না
ত্রুটি উত্থাপিত হয়েছে।
যদি না
সার্জারির যদি না ম্যাক্রো একটি লেখার জন্য একটি শর্টহ্যান্ড if যে বিবৃতি দেওয়া হয়েছে কিনা তা পরীক্ষা করে
শর্তসাপেক্ষ হয় মিথ্যা. নিম্নলিখিত এই ম্যাক্রো সম্প্রসারণ দেখায়.
(শর্তসাপেক্ষ বিবৃতি ছাড়া)
(যদি শর্তাধীন
না
(বিবৃতি দাও))
উদ্ধতি শেষ করা
একটি quasiquoted ফর্ম মধ্যে, উদ্ধতি শেষ করা একটি প্রতীকের মূল্যায়ন জোর করে। উদ্ধতি শেষ করা উপনাম করা হয়
টিল্ড (~) প্রতীক।
(def নাম "cuddles")
(কোয়াসিকোট (= নাম (উদ্ধৃতি নাম না)))
;=> (u'=' u'name' u'cuddles')
`(= নাম ~ নাম)
;=> (u'=' u'name' u'cuddles')
unquote- splice
unquote- splice একটি quasiquoted ফর্ম মধ্যে একটি প্রতীক মূল্যায়ন জোর করে, অনেকটা মত
উদ্ধতি শেষ করা. unquote- splice শুধুমাত্র তখনই ব্যবহার করা যেতে পারে যখন উদ্ধৃতিহীন প্রতীকটিতে একটি থাকে
পুনরাবৃত্তিযোগ্য মান, কারণ এটি "বিভক্ত" করে যেটিকে quasiquoted আকারে পুনরাবৃত্তি করা যায়। unquote- splice is
উপনাম ~@ প্রতীক।
(ডিএফ সংখ্যা [1 2 3 4])
(কোয়াসিকোট (+ (উদ্ধৃতি-বিভক্ত সংখ্যা)))
;=> (u'+' 1L 2L 3L 4L)
`(+ ~@সংখ্যা)
;=> (u'+' 1L 2L 3L 4L)
কখন
কখন অনুরূপ যদি না, প্রদত্ত শর্তাধীন হলে এটি পরীক্ষা করা ছাড়া সত্য। এইটা না
একটি আছে সম্ভব আর একটি মধ্যে ব্লক কখন ম্যাক্রো নিচের সম্প্রসারণ দেখায়
ম্যাক্রো
(যখন শর্তসাপেক্ষ বিবৃতি)
(যদি শর্তযুক্ত (বিবৃতি দিন))
যখন
যখন একটি শর্ত পূরণ না হওয়া পর্যন্ত এক বা একাধিক ব্লক কার্যকর করতে ব্যবহৃত হয়। অনুসরণ
উদাহরণ আউটপুট হবে "হ্যালো বিশ্ব!" পর্দায় অনির্দিষ্টকালের জন্য:
(যদিও সত্য (প্রিন্ট "হ্যালো ওয়ার্ল্ড!"))
সঙ্গে
সঙ্গে একটি প্রসঙ্গ ম্যানেজারের মধ্যে একটি ব্লকের সম্পাদন মোড়ানোর জন্য ব্যবহৃত হয়। প্রসঙ্গ
ম্যানেজার তারপর স্থানীয় সিস্টেম সেট আপ করতে পারেন এবং এটি একটি নিয়ন্ত্রিত পদ্ধতিতে বিচ্ছিন্ন করতে পারেন। দ্য
ব্যবহারের প্রত্নতাত্ত্বিক উদাহরণ সঙ্গে ফাইল প্রক্রিয়াকরণের সময় হয়। সঙ্গে একটি প্রসঙ্গ আবদ্ধ করতে পারেন
যুক্তি বা এটি সম্পূর্ণরূপে উপেক্ষা করুন, নীচে দেখানো হিসাবে:
([[arg (expr)]] ব্লক সহ)
([[(expr)]] ব্লক সহ)
([[arg(expr)] [(expr)]] ব্লক সহ)
নিম্নলিখিত উদাহরণ খুলবে সংবাদ ফাইল করুন এবং এর বিষয়বস্তু স্ক্রিনে প্রিন্ট করুন। দ্য
ফাইলটি প্রক্রিয়া হওয়ার পরে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।
(সহ [[f ("নিউজ" খুলুন)]] (মুদ্রণ (.পড়ুন চ)))
সঙ্গে-ডেকোরেটর
সঙ্গে-ডেকোরেটর একটি ফাংশনকে অন্যটির সাথে মোড়ানোর জন্য ব্যবহৃত হয়। ফাংশন সঞ্চালন
সজ্জা একটি একক মান গ্রহণ করা উচিত: ফাংশন সজ্জিত করা হচ্ছে, এবং একটি নতুন ফেরত
ফাংশন. সঙ্গে-ডেকোরেটর ন্যূনতম দুটি পরামিতি লাগে: ফাংশন পারফর্ম করছে
সজ্জা এবং ফাংশন সজ্জিত করা হচ্ছে. একাধিক ডেকোরেটর ফাংশন হতে পারে
প্রয়োগ করা এগুলি বাইরের থেকে ভেতরের দিকে ক্রমানুসারে প্রয়োগ করা হবে, অর্থাৎ। প্রথম
ডেকোরেটর হবে সবচেয়ে বাইরের, ইত্যাদি। যুক্তি দিয়ে সাজসজ্জাকারীদের বলা হয় ন্যায়সঙ্গত
একটি ফাংশন কল মত.
(সাথে-ডেকোরেটর ডেকোরেটর-মজা
(defn some-function [] ...)
(সজ্জিত ডেকোরেটর1 ডেকোরেটর২...
(defn some-function [] ...)
(সজ্জিতকারীর সাথে (ডেকোরেটর আর্গ) ..
(defn some-function [] ...)
নিম্নলিখিত উদাহরণে, ইনক-ডেকোরেটর ফাংশন সাজাইয়া ব্যবহার করা হয় যোগ সঙ্গে একটি
ফাংশন যা দুটি প্যারামিটার নেয় এবং মান সহ সজ্জিত ফাংশনকে কল করে
1 দ্বারা বৃদ্ধি. যখন সজ্জিত যোগ মান 1 এবং 1, শেষে বলা হয়
ফলাফল হবে 4 (1 + + 1 + 1 + + 1).
=> (defn inc-decorator [func]
... (fn [value-1 value-2] (func (+ value-1 1) (+ value-2 1))))
=> (defn inc2-ডেকোরেটর [func]
... (fn [value-1 value-2] (func (+ value-1 2) (+ value-2 2))))
=> (সজ্জিতকারী inc-ডেকোরেটর সহ (defn যোগ [a b] (+ a b)))
=> (সংযোজন 1 1)
4
=> (সজ্জিত inc2-ডেকোরেটর ইনক-ডেকোরেটর
... (defn সংযোজন [a b] (+ a b)))
=> (সংযোজন 1 1)
8
সহ-জেনসিম
0.9.12 সংস্করণে নতুন।
সহ-জেনসিম এর একটি সেট তৈরি করতে ব্যবহৃত হয় gensym একটি ম্যাক্রো ব্যবহারের জন্য। নিম্নলিখিত কোড:
(gensyms সহ [a b c]
...)
এতে প্রসারিত হয়:
(আলো [[a (gensym))
[বি (জেনসিম)
[গ (জেনসিম)]]
...)
SEE এছাড়াও:
জেনসিম ব্যবহার করে বিভাগ
উত্পাদ
উত্পাদ একটি জেনারেটর বস্তু তৈরি করতে ব্যবহৃত হয় যা এক বা একাধিক মান প্রদান করে। জেনারেটর
এটি পুনরাবৃত্তিযোগ্য এবং তাই লুপ, তালিকা বোঝা এবং অন্যান্য অনুরূপ ব্যবহার করা যেতে পারে
গঠন করে
কাজ এলোমেলো-সংখ্যা দেখায় কিভাবে জেনারেটর অসীম সিরিজ তৈরি করতে ব্যবহার করা যেতে পারে
অসীম পরিমাণ মেমরি গ্রাস না করে।
=> (defn গুন [বেস সহগ]
... (এর জন্য [[(, বেস সহগ) (জিপ বেস সহগ)]]
... (ফলন (* ভিত্তি সহগ))))
=> (গুণ করুন (পরিসীমা 5) (পরিসীমা 5))
এ গুন করুন
=> (তালিকা-কম্প মান [মান (গুণ করুন (পরিসীমা 10) (পরিসীমা 10))])
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
=> (এলোমেলো আমদানি)
=> (এলোমেলো-সংখ্যা [নিম্ন উচ্চ]
... (যদিও সত্য (ফলন (.randint এলোমেলো কম উচ্চ))))
=> (লিস্ট-কম x [x (15 নিন (এলোমেলো-সংখ্যা 1 50))])])
[7, 41, 6, 22, 32, 17, 5, 38, 18, 38, 17, 14, 23, 23, 19]
yield- থেকে
0.9.13 সংস্করণে নতুন।
পাইথন 3.3 এবং UP কেবল!
yield- থেকে একটি সাবজেনারেটর কল করতে ব্যবহৃত হয়। আপনি আপনার coroutine করতে চান তাহলে এটি দরকারী
অভিনব কিছু ব্যবহার করলে অন্য কোরোটিনে এর প্রক্রিয়াগুলি অর্পণ করতে সক্ষম হবেন
asyncio.
Hy মূল
মূল কার্যাবলী
বাটলাস্ট
ব্যবহার: (বাটলাস্ট কল)
মধ্যে শেষ আইটেম ছাড়া সবগুলির একটি পুনরাবৃত্তিকারী প্রদান করে৷ Coll.
=> (তালিকা (বাটলাস্ট (পরিসীমা 10)))
[১, ২, ৩, ৪, ৫, ৬, ৭, ৮, ৯]
=> (তালিকা (বাটলাস্ট [১]))
[]
=> (তালিকা (বাটলাস্ট []))
[]
=> (ইটারটুল আমদানি করুন)
=> (তালিকা (5 নিন (বাটলাস্ট (itertools.count 10))))
[১, ৪, ৫,,, ৯]
কল?
0.10.0 সংস্করণে নতুন।
ব্যবহার: (কল? x)
রিটার্নস বা মুনাফা সত্য if x পুনরাবৃত্তিযোগ্য এবং একটি স্ট্রিং নয়।
=> (কল? [1 2 3 4])
সত্য
=> (কল? {"a" 1 "b" 2})
সত্য
=> (কল? "abc")
মিথ্যা
কনস
0.10.0 সংস্করণে নতুন।
ব্যবহার: (cons a b)
গাড়ির সাথে একটি নতুন কনস সেল ফেরত দেয় a এবং cdr b.
=> (setv a (cons 'hd 'tl))
=> (='hd (কার a))
সত্য
=> (= 'tl (cdr a))
সত্য
খারাপ?
0.10.0 সংস্করণে নতুন।
ব্যবহার: (অপরাধ? foo)
কিনা যাচাই করে foo বিন্যাস একটি কনস সেল।
=> (setv a (cons 'hd 'tl))
=> (অপরাধ? ক)
সত্য
=> (অপরাধ? শূন্য)
মিথ্যা
=> (অপরাধ? [1 2 3])
মিথ্যা
ডিসেম্বর
ব্যবহার: (ডিসেম্বর x)
এর থেকে একটি কম ফেরত দেয় x. সমতুল্য (- x 1). বাড়ায় টাইপ ত্রুটি if (না (সংখ্যাসূচক? এক্স)).
=> (ডিসেম্বর ৩)
2
=> (ডিসেম্বর ৩)
-1
=> (ডিসেম্বর ৩)
11.3
অবতরণ করা
0.10.0 সংস্করণে নতুন।
ব্যবহার: (বিচ্ছিন্ন করা বৃক্ষ &ঐচ্ছিক [কোডজেন মিথ্যা])
দেওয়া Hy এর জন্য Python AST ডাম্প করুন বৃক্ষ স্ট্যান্ডার্ড আউটপুটে। যদি কোডজেন is সত্য, কাজ
পরিবর্তে পাইথন কোড প্রিন্ট করে।
=> (বিচ্ছিন্ন করা '("হ্যালো ওয়ার্ল্ড!" মুদ্রণ))
মডিউল(
শরীর=[
Expr(value=Call(func=Name(id='print'), args=[Str(s='Hello World!')], keyword=[], starargs=None, kwargs=None))])
=> (বিচ্ছিন্ন '("হ্যালো ওয়ার্ল্ড!" মুদ্রণ) সত্য)
প্রিন্ট ('হ্যালো ওয়ার্ল্ড!')
খালি?
ব্যবহার: (খালি? কল)
রিটার্নস বা মুনাফা সত্য if Coll খালি. সমতুল্য (= 0 (লেন কল)).
=> (খালি? [])
সত্য
=> (খালি? "")
সত্য
=> (খালি? (, 1 2))
মিথ্যা
প্রতি?
0.10.0 সংস্করণে নতুন।
ব্যবহার: (প্রতি? সামনে কল)
রিটার্নস বা মুনাফা সত্য if (পূর্ব x) প্রত্যেকের জন্য যৌক্তিক সত্য x in Collঅন্যথায় মিথ্যা. প্রত্যাবর্তন সত্য
if Coll খালি.
=> (প্রতিটি? এমনকি? [2 4 6])
সত্য
=> (প্রতিটি? এমনকি? [1 3 5])
মিথ্যা
=> (প্রতিটি? এমনকি? [2 4 5])
মিথ্যা
=> (প্রতিটি? এমনকি? [])
সত্য
ভাসা?
ব্যবহার: (ভাসা? x)
রিটার্নস বা মুনাফা সত্য if x একটি ফ্লোট হয়
=> (ভাসমান? 3.2)
সত্য
=> (ভাসা? -2)
মিথ্যা
এমন কি?
ব্যবহার: (এমন কি? x)
রিটার্নস বা মুনাফা সত্য if x এমনকি. বাড়ায় টাইপ ত্রুটি if (না (সংখ্যাসূচক? এক্স)).
=> (এমনকি? 2)
সত্য
=> (এমনকি? 13)
মিথ্যা
=> (এমনকি? 0)
সত্য
পরিচয়
ব্যবহার: (পরিচয় x)
ফাংশনে সরবরাহ করা আর্গুমেন্ট ফেরত দেয়।
=> (পরিচয় ৪)
4
=> (তালিকা (মানচিত্র পরিচয় [1 2 3 4]))
[১ ২ ৩ ৪]
Inc
ব্যবহার: (inc x)
এর থেকে বেশি ফেরত দেয় x. সমতুল্য (+ x 1). বাড়ায় টাইপ ত্রুটি if (না (সংখ্যাসূচক? এক্স)).
=> (inc 3)
4
=> (inc 0)
1
=> (inc 12.3)
13.3
দৃষ্টান্ত?
ব্যবহার: (দৃষ্টান্ত? শ্রেণী x)
রিটার্নস বা মুনাফা সত্য if x এর একটি উদাহরণ শ্রেণী.
=> (উদাহরণ? ফ্লোট 1.0)
সত্য
=> (উদাহরণ? int 7)
সত্য
=> (উদাহরণ? str (str "foo"))
সত্য
=> (ডিফক্লাস টেস্টক্লাস [অবজেক্ট])
=> (setv inst (TestClass))
=> (উদাহরণ? টেস্টক্লাস ইনস্ট্যান্স)
সত্য
পূর্ণসংখ্যা?
ব্যবহার: (পূর্ণসংখ্যা? x)
রিটার্নস বা মুনাফা সত্য if x একটি পূর্ণসংখ্যা। পাইথন 2 এর জন্য, এটি হয় কোন int or দীর্ঘ. পাইথন 3 এর জন্য,
এই কোন int.
=> (পূর্ণসংখ্যা? 3)
সত্য
=> (পূর্ণসংখ্যা? -2.4)
মিথ্যা
ইন্টারলিভ
0.10.1 সংস্করণে নতুন।
ব্যবহার: (ইন্টারলিভ seq1 seq2 ...)
প্রতিটি সিকোয়েন্সে প্রথম আইটেমের পুনরাবৃত্তিযোগ্য, তারপর দ্বিতীয়টি ইত্যাদি প্রদান করে।
=> (তালিকা (ইন্টারলিভ (পরিসীমা 5) (পরিসীমা 100 105)))
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
=> (তালিকা (ইন্টারলিভ (পরিসীমা 1000000) "abc"))
[0, 'a', 1, 'b', 2, 'c']
ইন্টারপোজ
0.10.1 সংস্করণে নতুন।
ব্যবহার: (হস্তক্ষেপ করা পদ সেক)
আইটেম দ্বারা বিভক্ত অনুক্রমের উপাদানগুলির একটি পুনরাবৃত্তিযোগ্য প্রদান করে।
=> (তালিকা (ইন্টারপোজ "!" "abcd"))
['এ বি সি ডি']
=> (তালিকা (ইন্টারপোজ -1 (পরিসীমা 5)))
[0, -1, 1, -1, 2, -1, 3, -1, 4]
পুনরাবৃত্তিযোগ্য?
ব্যবহার: (পুনরাবৃত্ত? x)
রিটার্নস বা মুনাফা সত্য if x পুনরাবৃত্তিযোগ্য। পুনরাবৃত্তিযোগ্য বস্তু যখন একটি নতুন পুনরাবৃত্তিকারী প্রদান করে (iter x) is
ডাকা বিপরীতের সাথে পুনরাবৃত্তিকারী?.
=>;; স্ট্রিং জন্য কাজ করে
=> (পুনরাবৃত্ত? (str "abcde"))
সত্য
=>;; তালিকার জন্য কাজ করে
=> (পুনরাবৃত্ত? [1 2 3 4 5])
সত্য
=>;; tuples জন্য কাজ করে
=> (পুনরাবৃত্তিযোগ্য? (, 1 2 3))
সত্য
=>;; dicts জন্য কাজ করে
=> (পুনরাবৃত্তিযোগ্য? {:a 1 :b 2 :c 3})
সত্য
=>;; পুনরাবৃত্তিকারী/জেনারেটরের জন্য কাজ করে
=> (পুনরাবৃত্ত? (3 পুনরাবৃত্তি))
সত্য
পুনরাবৃত্তিকারী?
ব্যবহার: (পুনরাবৃত্ত? x)
রিটার্নস বা মুনাফা সত্য if x একটি পুনরাবৃত্তিকারী। পুনরাবৃত্তিকারী এমন বস্তু যা নিজেকে একটি হিসাবে ফিরিয়ে দেয়
পুনরাবৃত্তিকারী যখন (iter x) বলা হয়. বিপরীতের সাথে পুনরাবৃত্তিযোগ্য?.
=>;; একটি তালিকার জন্য কাজ করে না
=> (পুনরাবৃত্ত? [1 2 3 4 5])
মিথ্যা
=>;; কিন্তু আমরা তালিকা থেকে একটি iter পেতে পারি
=> (পুনরাবৃত্ত? (iter [1 2 3 4 5]))
সত্য
=>;; ডিক্টের জন্য কাজ করে না
=> (পুনরাবৃত্ত? {:a 1 :b 2 :c 3})
মিথ্যা
=>;; ডিক্ট থেকে একটি পুনরাবৃত্তিকারী তৈরি করুন
=> (পুনরাবৃত্ত? (iter {:a 1 :b 2 :c 3}))
সত্য
তালিকা*
ব্যবহার: (তালিকা* মাথা &বিশ্রাম লেজ)
আর্গুমেন্ট সমন্বিত নেস্টেড কনস সেলের (একটি বিন্দুযুক্ত তালিকা) একটি চেইন তৈরি করে। যদি
যুক্তি তালিকায় শুধুমাত্র একটি উপাদান আছে, এটি ফেরত দিন।
=> (তালিকা* 1 2 3 4)
(1 2 3। 4)
=> (তালিকা* 1 2 3 [4])
[১, ৩, ৫, ১]
=> (তালিকা* 1)
1
=> (অপরাধ? (তালিকা* 1 2 3 4))
সত্য
macroexpand
0.10.0 সংস্করণে নতুন।
ব্যবহার: (ম্যাক্রো এক্সপ্যান্ড ফর্ম)
এর সম্পূর্ণ ম্যাক্রো সম্প্রসারণ প্রদান করে ফর্ম.
=> (ম্যাক্রোএক্সপ্যান্ড '(-> (a b) (x y)))
(u'x' (u'a' u'b') u'y')
=> (ম্যাক্রোএক্সপ্যান্ড '(-> (a b) (-> (c d) (e f))))
(u'e' (u'c' (u'a' u'b') u'd') u'f')
macroexpand-1
0.10.0 সংস্করণে নতুন।
ব্যবহার: (macroexpand-1 ফর্ম)
এর একক ধাপ ম্যাক্রো সম্প্রসারণ প্রদান করে ফর্ম.
=> (macroexpand-1' (-> (a b) (-> (c d) (e f))))
(u'_>' (u'a' u'b') (u'c' u'd') (u'e' u'f'))
সাথে একত্রীকরণ
0.10.1 সংস্করণে নতুন।
ব্যবহার: (সাথে একত্রীকরণ f &বিশ্রাম মানচিত্র)
একটি মানচিত্র ফেরত দেয় যা প্রথমে যোগ করা বাকি মানচিত্রের সমন্বয়ে গঠিত। যদি একটি কী ঘটে
একাধিক মানচিত্র, পরবর্তী (বাম-থেকে-ডান) থেকে ম্যাপিং(গুলি) এর সাথে একত্রিত হবে
কল করে ফলাফল ম্যাপিং (f ভাল-ইন-ফলাফল ভাল-ইন-লেটার).
=> (এর সাথে একত্রিত করুন (fn [x y] (+ x y)) {"a" 10 "b" 20} {"a" 1 "c" 30})
{u'a': 11L, u'c': 30L, u'b': 20L}
neg?
ব্যবহার: (নেগ? x)
রিটার্নস বা মুনাফা সত্য if x শূন্যের চেয়ে কম। বাড়ায় টাইপ ত্রুটি if (না (সংখ্যাসূচক? এক্স)).
=> (নেগ? -2)
সত্য
=> (নেগ? 3)
মিথ্যা
=> (নেগ? 0)
মিথ্যা
শূন্য?
ব্যবহার: (শূন্য? x)
রিটার্নস বা মুনাফা সত্য if x is শূন্য / না.
=> (শূন্য? শূন্য)
সত্য
=> (শূন্য? কোনোটিই নয়)
সত্য
=> (শূন্য? 0)
মিথ্যা
=> (setf x শূন্য)
=> (শূন্য? x)
সত্য
=>;; list.append সবসময় কোনটিই দেয় না
=> (শূন্য? (.সংযোজন [1 2 3] 4))
সত্য
কোনটি?
ব্যবহার: (কোনোটি? x)
রিটার্নস বা মুনাফা সত্য if x is না.
=> (কোনোটি? কোনোটিই নয়)
সত্য
=> (কোনোটি? 0)
মিথ্যা
=> (setf x কোনটিই নয়)
=> (কোনোটি? x)
সত্য
=>;; list.append সবসময় কোনটিই দেয় না
=> (কিছুই নয়? (.সংযোজন [1 2 3] 4))
সত্য
n তম
ব্যবহার: (নম Coll n &ঐচ্ছিক [ডিফল্ট শূন্য])
ফেরত দেয় n-একটি সংগ্রহের তম আইটেম, 0 থেকে গণনা করা হচ্ছে। ডিফল্ট মান ফেরত দিন, শূন্য, যদি
সীমার বাইরে (অন্যথায় নির্দিষ্ট না হলে) বাড়ায় মান ত্রুটি if n নেতিবাচক
=> (নম [১ ২ ৪ ৭] ১)
2
=> (নম [১ ২ ৪ ৭] ১)
7
=> (শূন্য? (nম [1 2 4 7] 5))
সত্য
=> (nম [1 2 4 7] 5 "ডিফল্ট")
'ডিফল্ট'
=> (নম (3 নিন (ড্রপ 2 [1 2 3 4 5 6])) 2))
5
=> (নম [1 2 4 7] -1)
ট্রেসব্যাক (সবচেয়ে সাম্প্রতিকতম কল সর্বশেষ):
...
মান ত্রুটি: islice() এর জন্য সূচকগুলি অবশ্যই কোনোটি নয় বা একটি পূর্ণসংখ্যা হতে হবে: 0 <= x <= sys.maxsize।
সংখ্যাসূচক?
ব্যবহার: (সংখ্যাসূচক? x)
রিটার্নস বা মুনাফা সত্য if x পাইথনের সংজ্ঞায়িত হিসাবে একটি সংখ্যাসূচক সংখ্যা।সংখ্যা বর্গ.
=> (সংখ্যাসূচক? -2)
সত্য
=> (সংখ্যাসূচক? 3.2)
সত্য
=> (সংখ্যাসূচক? "foo")
মিথ্যা
অস্বাভাবিক?
ব্যবহার: (অস্বাভাবিক? x)
রিটার্নস বা মুনাফা সত্য if x অদ্ভুত বাড়ায় টাইপ ত্রুটি if (না (সংখ্যাসূচক? এক্স)).
=> (বিজোড়? 13)
সত্য
=> (বিজোড়? 2)
মিথ্যা
=> (বিজোড়? 0)
মিথ্যা
অবস্থান?
ব্যবহার: (pos? x)
রিটার্নস বা মুনাফা সত্য if x শূন্যের চেয়ে বড়। বাড়ায় টাইপ ত্রুটি if (না (সংখ্যাসূচক? এক্স)).
=> (পদ? 3)
সত্য
=> (pos? -2)
মিথ্যা
=> (পদ? 0)
মিথ্যা
দ্বিতীয়
ব্যবহার: (দ্বিতীয় কল)
এর দ্বিতীয় সদস্য প্রদান করে Coll. সমতুল্য (পাওয়া Coll 1).
=> (দ্বিতীয় [0 1 2])
1
কিছু
0.10.0 সংস্করণে নতুন।
ব্যবহার: (কিছু সামনে কল)
এর প্রথম যৌক্তিক-সত্য মান প্রদান করে (পূর্ব x) কোন জন্য x in Collঅন্যথায় শূন্য.
প্রত্যাবর্তন শূন্য if Coll খালি.
=> (কিছু এমনকি? [2 4 6])
সত্য
=> (শূন্য? (কিছু এমনকি? [1 3 5]))
সত্য
=> (শূন্য? (কিছু পরিচয় [0 "" []]))
সত্য
=> (কিছু পরিচয় [0 "অ-খালি-স্ট্রিং" []])
'অ-খালি-স্ট্রিং'
=> (শূন্য? (কিছু এমনকি? []))
সত্য
স্ট্রিং?
ব্যবহার: (স্ট্রিং? x)
রিটার্নস বা মুনাফা সত্য if x একটি স্ট্রিং হয়
=> (স্ট্রিং? "foo")
সত্য
=> (স্ট্রিং? -2)
মিথ্যা
প্রতীক?
ব্যবহার: (প্রতীক? x)
রিটার্নস বা মুনাফা সত্য if x একটি প্রতীক।
=> (প্রতীক? 'foo)
সত্য
=> (প্রতীক? '[a b c])
মিথ্যা
শূন্য?
ব্যবহার: (শূন্য? x)
রিটার্নস বা মুনাফা সত্য if x শূন্য।
=> (শূন্য? 3)
মিথ্যা
=> (শূন্য? -2)
মিথ্যা
=> (শূন্য? 0)
সত্য
ক্রম কার্যাবলী
সিকোয়েন্স ফাংশন হয় একটি সম্ভাব্য অসীম ক্রম তৈরি করতে বা পরিচালনা করতে পারে
একটি তালিকা বা অনুরূপ পাত্রে ক্রমটি সম্পূর্ণরূপে উপলব্ধি করা প্রয়োজন৷ তারা এটা করে
একটি পাইথন পুনরাবৃত্তিকারী ফিরে আসছে।
কিভাবে ব্যবহার করতে হয় তার উদাহরণ হিসেবে আমরা ক্যানোনিকাল ইনফিনিট ফিবোনাচি নম্বর জেনারেটর ব্যবহার করতে পারি
এই ফাংশন কিছু.
(defn fib []
(setv a 0)
(setv খ 1)
(যদিও সত্য
(ফলন ক)
(setv (, ab) (, b (+ ab)))))
মনে রাখবেন (যখন সত্য ...) লুপ. আমরা যদি এটি REPL এ চালাই,
=> (ফাইব)
ফাংশন কল করা শুধুমাত্র একটি পুনরাবৃত্তিকারী প্রদান করে, কিন্তু আমরা এটি ব্যবহার না করা পর্যন্ত কোন কাজ করে না।
এইরকম কিছু চেষ্টা করার সুপারিশ করা হয় না কারণ অসীম লুপ এটি পর্যন্ত চলবে
সমস্ত উপলব্ধ RAM গ্রাস করে, বা এই ক্ষেত্রে যতক্ষণ না আমি এটিকে হত্যা করি।
=> (তালিকা (ফাইব))
[১] ৯১৪৭৪ জন নিহত হন
প্রথম 10টি ফিবোনাচি নম্বর পেতে, ব্যবহার করুন গ্রহণ করা। মনে রাখবেন যে গ্রহণ করা এছাড়াও একটি জেনারেটর ফেরত দেয়,
তাই আমি এটি থেকে একটি তালিকা তৈরি করি।
=> (তালিকা (10 নিন (ফাইব)))
[০, ২, ৪, ৬, ৮, ২০, ২৪, ২৮, ৩২, ৩৬]
সূচক 9 এ ফিবোনাচি নম্বর পেতে, (0 থেকে শুরু):
=> (নম (ফাইব) 9)
34
চক্র
ব্যবহার: (সাইকেল কল)
কলের সদস্যদের একটি অসীম পুনরাবৃত্তিকারী প্রদান করে।
=> (তালিকা (7 নিন (চক্র [1 2 3])))
[1, 2, 3, 1, 2, 3, 1]
=> (তালিকা (2 নিন (চক্র [1 2 3])))
[1, 2]
স্বতন্ত্র
ব্যবহার: (স্বতন্ত্র কল)
শুধুমাত্র অনন্য সদস্য সমন্বিত একটি পুনরাবৃত্তিকারী প্রদান করে Coll.
=> (তালিকা (স্বতন্ত্র [ 1 2 3 4 3 5 2 ]))
[১, ৪, ৫,,, ৯]
=> (তালিকা (স্বতন্ত্র []))
[]
=> (তালিকা (স্বতন্ত্র (iter [ 1 2 3 4 3 5 2 ])))
[১, ৪, ৫,,, ৯]
ঝরা
ব্যবহার: (ড্রপ n কল)
একটি পুনরাবৃত্তিকারী ফেরত দেয়, প্রথমটি এড়িয়ে যায় n এর সদস্য Coll. বাড়ায় মান ত্রুটি if n is
নেতিবাচক.
=> (তালিকা (ড্রপ 2 [1 2 3 4 5]))
[3, 4, 5]
=> (তালিকা (ড্রপ 4 [1 2 3 4 5]))
[5]
=> (তালিকা (ড্রপ 0 [1 2 3 4 5]))
[১, ৪, ৫,,, ৯]
=> (তালিকা (ড্রপ 6 [1 2 3 4 5]))
[]
ড্রপ-লাস্ট
ব্যবহার: (ড্রপ-লাস্ট n কল)
শেষ বাদে সকলের একটি পুনরাবৃত্তিকারী প্রদান করে n আইটেম Coll. বাড়ায় মান ত্রুটি if n is
নেতিবাচক.
=> (তালিকা (ড্রপ-লাস্ট 5 (পরিসীমা 10 20)))
[১, ৪, ৫,,, ৯]
=> (তালিকা (ড্রপ-লাস্ট 0 (পরিসীমা 5)))
[১, ৪, ৫,,, ৯]
=> (তালিকা (ড্রপ-লাস্ট 100 (পরিসীমা 100)))
[]
=> (ইটারটুল আমদানি করুন)
=> (তালিকা (5 নিন (ড্রপ-লাস্ট 100 (itertools.count 10))))
[১, ৪, ৫,,, ৯]
drop-while
ব্যবহার: (ড্রপ-সময় সামনে কল)
সদস্যদের বাদ দিয়ে একটি পুনরাবৃত্তিকারী প্রদান করে Coll পর্যন্ত সামনে is মিথ্যা.
=> (তালিকা (ড্রপ-যখনও? [2 4 7 8 9]))
[7, 8, 9]
=> (তালিকা (ড্রপ-ওয়াইলে সাংখ্যিক? [1 2 3 কোনটিই "a"])))
[কোনটিই নয়, উ'আ']
=> (তালিকা (ড্রপ-হোয়্যাল পোস্ট? [2 4 7 8 9]))
[]
ছাঁকনি
ব্যবহার: (ছাঁকনি সামনে কল)
সমস্ত আইটেমের জন্য একটি পুনরাবৃত্তিকারী প্রদান করে৷ Coll যে predicate পাস সামনে.
আরো দেখুন অপসারণ.
=> (তালিকা (ফিল্টার পোস? [1 2 3 -4 5 -7]))
[১, ৩, ৫, ১]
=> (তালিকা (ফিল্টার এমনকি? [1 2 3 -4 5 -7]))
[২, -৪]
চেপটান
0.9.12 সংস্করণে নতুন।
ব্যবহার: (সমতল করা কল)
এর মধ্যে থাকা সমস্ত আইটেমের একটি একক তালিকা প্রদান করে৷ Coll, সমস্ত অন্তর্ভুক্ত তালিকা এবং/অথবা সমতল করে
tuples
=> (চ্যাপ্টা [1 2 [3 4] 5])
[১, ৪, ৫,,, ৯]
=> (চ্যাপ্টা ["foo" (, 1 2) [1 [2 3] 4] "বার"])
['ফু', 1, 2, 1, 2, 3, 4, 'বার']
পুনরাবৃত্তি
ব্যবহার: (পুনরাবৃত্তি fn x)
এর একটি পুনরাবৃত্তিকারী প্রদান করে x, fn(x), fn(fn(x))ইত্যাদি
=> (তালিকা (5 নিন (পুনরাবৃত্তি 5)))
[১, ৪, ৫,,, ৯]
=> (তালিকা (5 নিন (পুনরাবৃত্তি (fn [x] (* x x)) 5)))
[১, ৪, ৫,,, ৯]
পড়া
ব্যবহার: (পড়া &ঐচ্ছিক [ফাইল থেকে eof])
থেকে পরবর্তী Hy অভিব্যক্তি পড়ে থেকে ফাইল (এতে ডিফল্ট sys.stdin), এবং একটি নিতে পারেন
EOF হিসাবে একক বাইট (একটি খালি স্ট্রিং ডিফল্ট)। বাড়ায় ইওএফেরর if থেকে ফাইল আগে শেষ হয়
একটি সম্পূর্ণ অভিব্যক্তি পার্স করা যেতে পারে।
=> (পড়ুন)
(+ 2 2)
('+' 2 2)
=> (ইভাল (পড়ুন))
(+ 2 2)
4
=> (আমদানি io)
=> (def বাফার (io.StringIO "(+ 2 2)\n(- 2 1)"))
=> (eval (পঠন প্রয়োগ করুন [] {"from_file" বাফার}))
4
=> (eval (পঠন প্রয়োগ করুন [] {"from_file" বাফার}))
1
=> অনুমান করা "example.hy" এর মধ্যে রয়েছে:
=> ("হ্যালো" মুদ্রণ)
=> ("hyfriends!" প্রিন্ট করুন)
=> ([[f ("example.hy" খুলুন)]] দিয়ে
... (চেষ্টা করুন
... (যদিও সত্য
... (চলুন [[exp (পড়ুন চ)]]
... (করুন
... ("OHY" এক্সপ্রিন্ট মুদ্রণ)
... (ইভাল এক্সপ্রেস))))
... (ধরুন [ই ইওএফেরর]
... (প্রিন্ট "EOF!"))))
ওহ ('প্রিন্ট' 'হ্যালো')
হ্যালো
ওহ ('প্রিন্ট' 'হাইফ্রেন্ডস!')
বন্ধুরা!
ইওএফ !
অপসারণ
ব্যবহার: (অপসারণ সামনে কল)
থেকে একটি পুনরাবৃত্তিকারী প্রদান করে Coll উপাদানগুলির সাথে যা পূর্বাভাস পাস করে, সামনে, সরানো হয়েছে।
আরো দেখুন ছাঁকনি.
=> (তালিকা (বিজোড় সরান? [1 2 3 4 5 6 7]))
[2, 4, 6]
=> (তালিকা (পোস সরান? [1 2 3 4 5 6 7]))
[]
=> (তালিকা (নেগ সরান? [1 2 3 4 5 6 7]))
[1, 2, 3, 4, 5, 6, 7]
পুনরাবৃত্তি
ব্যবহার: (পুনরাবৃত্তি x)
এর একটি পুনরাবৃত্তিকারী (অসীম) প্রদান করে x.
=> (তালিকা (6 নিন (পুনরাবৃত্তি "s")))
[তুমি', তুমি', তুমি', তুমি', তুমি', তুমি']
পুনঃপুনঃ
ব্যবহার: (পুনঃপুনঃ fn)
কল করে একটি পুনরাবৃত্তিকারী ফেরত দেয় fn পুনঃপুনঃ.
=> (আমদানি [এলোমেলো [র্যান্ডিন্ট]])
=> (তালিকা (5 নিন (বারবার (fn [] (randint 0 10)))))
[১, ৪, ৫,,, ৯]
গ্রহণ করা
ব্যবহার: (গ্রহণ করা n কল)
প্রথমটি ধারণকারী একটি পুনরাবৃত্তিকারী প্রদান করে n এর সদস্য Coll. বাড়ায় মান ত্রুটি if n is
নেতিবাচক.
=> (তালিকা (৩ নিন [১ ২ ৩ ৪ ৫]))
[1, 2, 3]
=> (তালিকা (4 নিন (পুনরাবৃত্তি "s")))
[তুমি', তুমি', তুমি', তুমি']
=> (তালিকা (0 নিন (পুনরাবৃত্তি "s")))
[]
গ্রহণ-নম
ব্যবহার: (টেক-নম n কল)
প্রতিটি ধারণকারী একটি পুনরাবৃত্তিকারী প্রদান করে n-এর তম সদস্য Coll.
=> (তালিকা (নম 2 [1 2 3 4 5 6 7]))
[১, ৩, ৫, ১]
=> (তালিকা (নম 3 [1 2 3 4 5 6 7]))
[1, 4, 7]
=> (তালিকা (নম 4 [1 2 3 4 5 6 7]))
[1, 5]
=> (তালিকা (নম 10 [1 2 3 4 5 6 7]))
[1]
take-while
ব্যবহার: (সময় নিন সামনে কল)
থেকে একটি পুনরাবৃত্তিকারী প্রদান করে Coll যতক্ষন পর্যন্ত না সামনে আয় সত্য.
=> (তালিকা (অবস্থা নেওয়ার সময়? [ 1 2 3 -4 5]))
[1, 2, 3]
=> (তালিকা (নেগ করার সময়? [ -4 -3 1 2 5]))
[-৪, -৩]
=> (তালিকা (নেগ করার সময়? [ 1 2 3 -4 5]))
[]
জিপ দিয়ে
0.9.13 সংস্করণে নতুন।
ব্যবহার: (জিপ দিয়ে fn Coll ...)
সমতুল্য ফ্যাস্ শব্দ, কিন্তু একটি টিপল তৈরি করার পরিবর্তে একটি মাল্টি-আর্গুমেন্ট ফাংশন ব্যবহার করে। যদি
জিপ দিয়ে তারপর N সংগ্রহের সাথে বলা হয় fn N আর্গুমেন্ট গ্রহণ করতে হবে।
=> (আমদানি অপারেটর)
=> (তালিকা (zipwith operator.add [1 2 3] [4 5 6]))
[5, 7, 9]
পাঠক ম্যাক্রো
রিডার ম্যাক্রো লিস্পকে ফ্লাইতে সিনট্যাক্স পরিবর্তন ও পরিবর্তন করার ক্ষমতা দেয়। আপনি চান না
পোলিশ স্বরলিপি? একটি পাঠক ম্যাক্রো সহজেই এটি করতে পারে। একটি থাকার Clojure এর উপায় চান
regex? পাঠক ম্যাক্রোও এটি সহজেই করতে পারে।
বাক্য গঠন
=> (ডিফ্রিডার ^ [এক্সপিআর] (প্রিন্ট এক্সপ্র))
=> #^(1 2 3 4)
(1)
=> #^"হ্যালো"
"হ্যালো"
=> #^1+2+3+4+3+2
1+2+3+4+3+2
Hy tuples জন্য কোন আক্ষরিক আছে. আপনি অপছন্দ বলুন (, ...) এবং অন্য কিছু চাই। এই
একটি সমস্যা পাঠক ম্যাক্রো একটি ঝরঝরে উপায়ে সমাধান করতে সক্ষম হয়.
=> (ডিফ্রিডার টি [এক্সপ্র] `(, ~@এক্সপ্র))
=> #t(1 2 3)
(1, 2, 3)
এমনকি আপনি এটি Clojure এর মতো করতে পারেন এবং নিয়মিত অভিব্যক্তির জন্য একটি আক্ষরিক থাকতে পারেন!
=> (আমদানি পুনরায়)
=> (defreader r [expr] `(re.compile ~expr))
=> #r"*"
এ
বাস্তবায়ন
ডিফ্রিডার পাঠক ম্যাক্রোর জন্য প্রতীক নাম হিসাবে একটি একক অক্ষর নেয়; আর কিছু
একটি ত্রুটি ফেরত দেবে। বাস্তবায়ন-ভিত্তিক, ডিফ্রিডার একটি দিয়ে আচ্ছাদিত একটি ল্যাম্বডায় প্রসারিত হয়
ডেকোরেটর এই ডেকোরেটর ল্যাম্বডাকে তার মডিউল নাম সহ একটি অভিধানে সংরক্ষণ করে
প্রতীক।
=> (ডিফ্রিডার ^ [এক্সপিআর] (প্রিন্ট এক্সপ্র))
;=> (সাথে_ডেকোরেটর (hy.macros.reader ^) (fn [expr] (প্রিন্ট expr)))
# মধ্যে প্রসারিত হয় (প্রেরণ_রিডার_ম্যাক্রো ...) যেখানে প্রতীক এবং অভিব্যক্তি পাস করা হয়
সঠিক ফাংশন।
=> #^()
;=> (ডিসপ্যাচ_রিডার_ম্যাক্রো ^ ())
=> #^"হ্যালো"
"হ্যালো"
সতর্কতা:
হাই এর লেক্সার এবং পার্সারে একটি সীমাবদ্ধতার কারণে, পাঠক ম্যাক্রো সংজ্ঞায়িত পুনরায় সংজ্ঞায়িত করতে পারে না
সিনট্যাক্স যেমন ()[]{}. এটি সম্ভবত ভবিষ্যতে সম্বোধন করা হবে।
অভ্যন্তরীণ Hy ডকুমেন্টেশন
লক্ষ্য করুন:
এই বিটগুলি বেশিরভাগ লোকদের জন্য দরকারী যারা Hy নিজেই হ্যাক করে, তবে এর জন্যও ব্যবহার করা যেতে পারে
যারা ম্যাক্রো প্রোগ্রামিং এর গভীরে তলিয়ে যায়।
Hy মডেল
ভূমিকা থেকে Hy মডেল
হাই মডেলগুলি নিয়মিত পাইথন বস্তুর উপরে একটি খুব পাতলা স্তর, যা Hy উত্সকে প্রতিনিধিত্ব করে
ডেটা হিসাবে কোড। মডেল শুধুমাত্র উৎস অবস্থানের তথ্য যোগ করে, এবং কিছু পদ্ধতিতে
হাই সোর্স কোডের পরিষ্কার ম্যানিপুলেশন সমর্থন করে, উদাহরণস্বরূপ ম্যাক্রোতে। যে অর্জন
লক্ষ্য, হাই মডেলগুলি একটি বেস পাইথন ক্লাসের মিশ্রণ এবং HyObject.
HyObject
hy.models.HyObject হাই মডেলের বেস ক্লাস। এটি শুধুমাত্র একটি পদ্ধতি প্রয়োগ করে, প্রতিস্থাপন করা,
যা বর্তমান অবজেক্টের সোর্স পজিশনকে আর্গুমেন্ট হিসেবে পাস করা একটি দিয়ে প্রতিস্থাপন করে।
এটি আমাদের অভিব্যক্তির মূল অবস্থানের ট্র্যাক রাখতে দেয় যা দ্বারা পরিবর্তিত হয়
ম্যাক্রো, সেটা কম্পাইলারে হোক বা বিশুদ্ধ হাই ম্যাক্রোতে।
HyObject হাই মডেলগুলিকে ইনস্ট্যান্টিয়েট করার জন্য সরাসরি ব্যবহার করার উদ্দেশ্যে নয়, তবে শুধুমাত্র একটি মিশ্রণ হিসাবে
অন্যান্য ক্লাসের জন্য।
যৌগিক মডেল
বন্ধনী এবং বন্ধনী তালিকা হাই পার্সার দ্বারা যৌগিক মডেল হিসাবে পার্স করা হয়।
হাইলিস্ট
hy.models.list.HyList "পুনরাবৃত্ত" হাই মডেলের বেস ক্লাস। এর মৌলিক ব্যবহার হচ্ছে
বন্ধনী প্রতিনিধিত্ব [] তালিকা, যা, যখন একটি শীর্ষ-স্তরের অভিব্যক্তি হিসাবে ব্যবহৃত হয়, এতে অনুবাদ করে
সংকলন পর্বে পাইথন তালিকা আক্ষরিক।
অন্য পুনরাবৃত্তিযোগ্য বস্তুতে একটি HyList যোগ করা বাম-হাতের-সাইড অবজেক্টের ক্লাস পুনরায় ব্যবহার করে,
একটি দরকারী আচরণ যখন আপনি একটি ম্যাক্রোতে হাই অবজেক্টকে সংযুক্ত করতে চান, উদাহরণস্বরূপ।
হাই এক্সপ্রেশন
hy.models.expression.HyExpression উত্তরাধিকার হাইলিস্ট বন্ধনীর জন্য () অভিব্যক্তি দ্য
এই অভিব্যক্তিগুলির সংকলন ফলাফল তালিকার প্রথম উপাদানের উপর নির্ভর করে:
কম্পাইলার কম্পাইলার বিশেষ-ফর্ম, ব্যবহারকারী-সংজ্ঞায়িত ম্যাক্রো এবং এর মধ্যে অভিব্যক্তি প্রেরণ করে
নিয়মিত পাইথন ফাংশন কল।
হাইডিক্ট
hy.models.dict.HyDict উত্তরাধিকার হাইলিস্ট কোঁকড়া-বন্ধনীর জন্য {} অভিব্যক্তি, যা কম্পাইল
একটি পাইথন অভিধানে আক্ষরিক।
বেস ক্লাস হিসাবে একটি dict পরিবর্তে একটি তালিকা ব্যবহার করার সিদ্ধান্ত হাইডিক্ট সহজ অনুমতি দেয়
যৌগিক অভিব্যক্তির অনুমতি দেওয়ার অতিরিক্ত সুবিধা সহ ম্যাক্রোতে নির্দেশাবলীর ম্যানিপুলেশন
ডিক্ট কী হিসাবে (যেমন, উদাহরণস্বরূপ, হাই এক্সপ্রেশন পাইথন ক্লাস হ্যাশেবল নয়)।
পারমাণবিক মডেল
ইনপুট স্ট্রীমে, ডবল-উদ্ধৃত স্ট্রিং, স্ট্রিংয়ের জন্য পাইথন স্বরলিপিকে সম্মান করে,
একটি একক টোকেন হিসাবে পার্স করা হয়, যা সরাসরি a হিসাবে পার্স করা হয়৷ হাইস্ট্রিং.
অক্ষরগুলির একটি নিরবচ্ছিন্ন স্ট্রিং, স্পেস, বন্ধনী, উদ্ধৃতি, দ্বি-উদ্ধৃতি বাদ দিয়ে
এবং মন্তব্য, একটি শনাক্তকারী হিসাবে পার্স করা হয়.
নিম্নলিখিত ক্রমে পার্সিং পর্বের সময় শনাক্তকারীরা পারমাণবিক মডেলগুলিতে সমাধান করা হয়:
· HyInteger
· হাইফ্লোট
· হাইকমপ্লেক্স (যদি পরমাণুটি খালি না হয় j)
· হাইকিওয়ার্ড (যদি পরমাণু দিয়ে শুরু হয় :)
· হাইসিম্বল
হাইস্ট্রিং
hy.models.string.HyString স্ট্রিং-সমতুল্য Hy মডেলের বেস ক্লাস। এটাও
ডবল-উদ্ধৃত স্ট্রিং লিটারেল প্রতিনিধিত্ব করে, "", যা ইউনিকোড স্ট্রিং-এ কম্পাইল করে
পাইথনে আক্ষরিক। হাইস্ট্রিংস পাইথন 2 এ ইউনিকোড অবজেক্ট এবং স্ট্রিং অবজেক্ট ইনহেরিট করুন
পাইথন 3 (এবং তাই এনকোডিং-নির্ভর নয়)।
হাইস্ট্রিং ভিত্তিক মডেলগুলি অপরিবর্তনীয়।
হাই আক্ষরিক স্ট্রিং একাধিক লাইন বিস্তৃত করতে পারে, এবং পার্সার দ্বারা একক হিসাবে বিবেচনা করা হয়
ইউনিট, পাইথনকে সম্মান করে ইউনিকোড স্ট্রিংয়ের জন্য পালিয়ে যায়।
সাংখ্যিক মডেল
hy.models.integer.HyInteger পূর্ণসংখ্যা আক্ষরিক প্রতিনিধিত্ব করে ( ব্যবহার করে দীর্ঘ পাইথন 2 এ টাইপ করুন,
এবং কোন int পাইথন 3 এ)।
hy.models.float.HyFloat ভাসমান-বিন্দু আক্ষরিক প্রতিনিধিত্ব করে।
hy.models.complex.HyComplex জটিল আক্ষরিক প্রতিনিধিত্ব করে।
সাংখ্যিক মডেলগুলি সংশ্লিষ্ট পাইথন রুটিন এবং বৈধ সংখ্যাসূচক পাইথন ব্যবহার করে পার্স করা হয়
আক্ষরিক তাদের Hy প্রতিরূপ পরিণত করা হবে.
হাইসিম্বল
hy.models.symbol.HySymbol হাই ভাষায় চিহ্নের প্রতিনিধিত্ব করতে ব্যবহৃত মডেল। এটা
উত্তরাধিকার হাইস্ট্রিং.
হাইসিম্বল পাইথন ইন্টারঅপারেবিলিটি সাহায্য করার জন্য পার্সিং পর্বে অবজেক্টগুলিকে আটকানো হয়:
তারকাচিহ্ন দ্বারা বেষ্টিত প্রতীক (*) বড় হাতের অক্ষরে পরিণত হয়;
· ড্যাশ (-) আন্ডারস্কোরে পরিণত হয় (_);
একটি অনুগামী প্রশ্ন চিহ্ন (?) একটি নেতৃস্থানীয় মধ্যে পরিণত হয় is_.
সতর্কতা: পার্সিং পর্বের সময় ম্যাংলিং করা হয়, এটি সম্ভব
প্রোগ্রাম্যাটিকভাবে HySymbols তৈরি করে যা Hy সোর্স কোড দিয়ে তৈরি করা যায় না। যেমন ক
মেকানিজম ব্যবহার করা হয় gensym দ্বারা "uninterned" চিহ্ন তৈরি করতে।
হাইকিওয়ার্ড
hy.models.keyword.HyKeyword Hy-এ কীওয়ার্ড প্রতিনিধিত্ব করে। কীওয়ার্ড হল প্রতীক দিয়ে শুরু
a :. ক্লাস উত্তরাধিকারসূত্রে পায় হাইস্ট্রিং.
পার্থক্য করতে হাইকিওয়ার্ডস থেকে হাইসিম্বল, সম্ভাবনা ছাড়া (অনিচ্ছাকৃত)
সংঘর্ষ, ব্যক্তিগত-ব্যবহারের ইউনিকোড অক্ষর "\uFDD0" কিওয়ার্ড আক্ষরিক আগে প্রিপেনড হয়
স্টোরেজ আগে।
মন্দ দিক সেল
hy.models.cons.HyCons পাইথন-বান্ধব একটি উপস্থাপনা কনস কোষ. কনস সেল হয়
বিশেষ করে "স্বাভাবিক" LISP ভেরিয়েন্ট যেমন স্কিম বা সাধারণের বৈশিষ্ট্যগুলি অনুকরণ করতে উপযোগী৷
লিস্প
একটি কনস সেল হল একটি 2-আইটেম অবজেক্ট, যার মধ্যে একটি গাড়ী (মাথা) এবং ক CDR (লেজ)। কিছু লিস্পে
ভেরিয়েন্ট, কনস সেল হল মৌলিক বিল্ডিং ব্লক, এবং এস-এক্সপ্রেশনগুলি আসলে
কনস কোষগুলির লিঙ্কযুক্ত তালিকা হিসাবে উপস্থাপিত। স্বাভাবিকের মতো হাই-এ এমনটা হয় না
এক্সপ্রেশনগুলি পাইথন তালিকা দিয়ে তৈরি করা হয় a তে মোড়ানো হাই এক্সপ্রেশন। তবে হাইকনস
এইভাবে "স্বাভাবিক" লিস্প ভেরিয়েন্টের আচরণ নকল করে:
· (cons কিছু শূন্য) is (হাই এক্সপ্রেশন [কিছু])
· (cons কিছু কিছু তালিকা) is (প্রকার কিছু তালিকা) (+ [কিছু] কিছু তালিকা)) (যদি
কিছু তালিকা থেকে উত্তরাধিকারসূত্রে প্রাপ্ত তালিকা).
· (পাওয়া (cons a b) 0) is a
· (টুকরা (cons a b) 1) is b
Hy একটি ডটেড-তালিকা সিনট্যাক্স সমর্থন করে, যেখানে '(ক . b) মানে (cons 'a 'খ) এবং '(ক b . c) মানে
(cons 'a (cons 'b 'গ)). যদি কম্পাইলার উপরের স্তরে একটি কনস সেলের সম্মুখীন হয়, এটি উত্থাপন করে
একটি সংকলন ত্রুটি।
হাইকনস পাস করা আর্গুমেন্ট (কার এবং সিডিআর) হাই টাইপের মধ্যে মোড়ানো, এর ম্যানিপুলেশন সহজ করার জন্য
একটি ম্যাক্রো প্রসঙ্গে কনস কোষ।
Hy অভ্যন্তরীণ তত্ত্ব
সংক্ষিপ্ত বিবরণ
হাই ইন্টারনালগুলি পাইথন বাইটকোডের ফ্রন্ট-এন্ড হিসাবে কাজ করে, যাতে Hy নিজেই
পাইথন বাইটকোডে কম্পাইল করে, একটি অপরিবর্তিত পাইথন রানটাইমকে হাই কোড চালানোর অনুমতি দেয়,
এমনকি এটা খেয়াল না করেই।
আমরা যেভাবে এটি করি তা হল Hy কে একটি অভ্যন্তরীণ Python AST ডেটাস্ট্রাকচারে অনুবাদ করে, এবং
পাইথন স্ট্যান্ডার্ড থেকে মডিউল ব্যবহার করে পাইথন বাইটকোডে AST তৈরি করা
লাইব্রেরি, যাতে আমাদের প্রত্যেকের জন্য পাইথন ইন্টারনালের সমস্ত কাজ নকল করতে না হয়
একক পাইথন রিলিজ।
হাই চারটি পর্যায়ে কাজ করে। নিম্নলিখিত বিভাগগুলি উৎস থেকে Hy এর প্রতিটি ধাপকে কভার করবে
রানটাইম
প্রারম্ভিক ব্যবহারের নির্দেশাবলী 1 এবং 2: টোকেনাইজিং এবং পদান্বয়
Hy কম্পাইল করার প্রথম ধাপ হল সোর্সটিকে টোকেনে লেক্স করা যা আমরা মোকাবেলা করতে পারি। আমরা
rply নামক একটি প্রকল্প ব্যবহার করুন, যা একটি উপসেটে লেখা সত্যিই চমৎকার (এবং দ্রুত) পার্সার
পাইথনের নাম rpython.
লেক্সিং কোড সব সংজ্ঞায়িত করা হয় hy.lex.lexer. এই কোডটি বেশিরভাগই শুধু Hy সংজ্ঞায়িত করে
ব্যাকরণ, এবং সমস্ত প্রকৃত কঠিন অংশ rply দ্বারা যত্ন নেওয়া হয় -- আমরা শুধু সংজ্ঞায়িত করি
rply ইনের জন্য "কলব্যাক" hy.lex.parser, যা উৎপন্ন টোকেন নেয় এবং ফেরত দেয়
হাই মডেল.
আপনি Hy মডেলগুলিকে Hy এর জন্য "AST" হিসাবে ভাবতে পারেন, এটিই ম্যাক্রো কাজ করে৷
(সরাসরি), এবং এটি হাই ডাউন কম্পাইল করার সময় কম্পাইলার ব্যবহার করে।
SEE এছাড়াও:
অধ্যায় Hy মডেল Hy মডেল এবং সেগুলি কী বোঝায় সে সম্পর্কে আরও তথ্যের জন্য।
ধাপ 3: Hy সংকলন থেকে পাইথন এবং AST
হাই এর বেশিরভাগ জাদু এখানেই ঘটে। এখানেই আমরা হাই এএসটি (মডেল) নিই,
এবং সেগুলি পাইথন AST-তে কম্পাইল করুন। মজার জিনিস একটি দম্পতি কিছু অতীত কাজ এখানে ঘটতে
AST-তে সমস্যা, এবং কম্পাইলারে কাজ করা আমাদের সবচেয়ে গুরুত্বপূর্ণ কাজগুলির মধ্যে কয়েকটি
আছে।
কম্পাইলারটি কিছুটা জটিল, তাই প্রথম শটে এটিকে গ্রোক না করলে খারাপ লাগবে না,
এটা ঠিক পেতে একটু সময় লাগতে পারে.
কম্পাইলার প্রধান এন্ট্রি পয়েন্ট হয় HyASTCompiler.compile. এই পদ্ধতি আহ্বান করা হয়, এবং
ক্লাসে একমাত্র প্রকৃত "পাবলিক" পদ্ধতি (যা বলতে হয়, আমরা সত্যিই প্রতিশ্রুতি দিই না
সেই পদ্ধতির বাইরে API)।
আসলে, এমনকি অভ্যন্তরীণভাবে, আমরা খুব কমই সরাসরি পুনরাবৃত্তি করি না, আমরা প্রায় সবসময় জোর করি
হাই গাছ মাধ্যমে সংকলন, এবং প্রায়শই একটি অভিব্যক্তির উপ-উপাদানের সাথে এটি করবে
আমাদের যা আছে. উপ-উপাদানগুলি সঠিকভাবে প্রেরণ করা টাইপ-ভিত্তিক প্রেরণকারীর উপর নির্ভর করে।
একটি সংকলন preform যে সমস্ত পদ্ধতি সঙ্গে চিহ্নিত করা হয় @বিল্ডস() ডেকোরেটর আপনি পারেন
হয় হাই মডেলের ক্লাসটি পাস করুন যা এটি কম্পাইল করে, অথবা আপনি একটি স্ট্রিং ব্যবহার করতে পারেন
অভিব্যক্তি আমি এক সেকেন্ডের মধ্যে এটি পরিষ্কার করব।
প্রথম পর্যায় টাইপ-ডিসপ্যাচ
এর মধ্যে শুরু করা যাক সংকলন পদ্ধতি আমরা প্রথম জিনিস জিনিসের ধরন চেক করা হয়
আমরা নির্মাণ করছি। আমরা দেখতে চাই যে আমাদের এমন একটি পদ্ধতি আছে যা তৈরি করতে পারে প্রকার() আমরা যে
আছে, এবং এটি পরিচালনা করতে পারে এমন পদ্ধতিতে প্রেরণ করুন। যদি আমাদের কোন পদ্ধতি না থাকে যেটা করতে পারি
যে ধরনের নির্মাণ, আমরা একটি অভ্যন্তরীণ বাড়াতে ব্যতিক্রম.
উদাহরণস্বরূপ, যদি আমরা একটি হাইস্ট্রিং, আমাদের কাছে হাই AST থেকে পাইথনের প্রায় 1-থেকে-1 ম্যাপিং আছে
AST. দ্য compile_string পদ্ধতি লাগে হাইস্ট্রিং, এবং একটি ফেরত দেয় ast.Str() যে
সঠিক লাইন-সংখ্যা এবং বিষয়বস্তু দ্বারা জনবহুল।
ম্যাক্রো-প্রসারিত করুন
আমরা যদি একটি পেতে হাই এক্সপ্রেশন, আমরা এটি একটি পরিচিত ম্যাক্রো কিনা তা দেখার চেষ্টা করব, এবং আছে করার জন্য চাপ দিব
এটি আহ্বানের মাধ্যমে প্রসারিত হয়েছে hy.macros.macroexpand, তারপর ফলাফলটি আবার ভিতরে ধাক্কা দিন
HyASTCompiler.compile.
দ্বিতীয় পর্যায় অভিব্যক্তি-প্রেরণ
একমাত্র বিশেষ ক্ষেত্রে হল হাই এক্সপ্রেশন, যেহেতু আমাদের নির্ভর করে বিভিন্ন AST তৈরি করতে হবে
প্রশ্নে বিশেষ ফর্মের উপর। উদাহরণস্বরূপ, যখন আমরা একটি আঘাত (যদি সত্য সত্য মিথ্যা), আমরা
একটি উৎপন্ন করতে হবে ast.If, এবং সঠিকভাবে সাব-নোডগুলি কম্পাইল করুন। এই যেখানে @বিল্ডস()
একটি স্ট্রিং এর সাথে একটি আর্গুমেন্ট আসে।
জন্য compile_expression (যা একটি দিয়ে সংজ্ঞায়িত করা হয়েছে @builds(HyExpression)) প্রেরণ করবে
প্রথম আর্গুমেন্টের স্ট্রিং এর উপর ভিত্তি করে। যদি, কোন কারণে, প্রথম যুক্তি না
একটি স্ট্রিং, এটি সেই ক্ষেত্রেও সঠিকভাবে পরিচালনা করবে (সম্ভবত একটি উত্থাপন করে ব্যতিক্রম).
যদি স্ট্রিংটি Hy-এর কাছে পরিচিত না হয় তবে এটি একটি তৈরি করতে ডিফল্ট হবে ast.কল, যা করার চেষ্টা করবে
একটি রানটাইম কল করুন (পাইথনে, এরকম কিছু foo()).
সমস্যা আঘাত সঙ্গে পাইথন এবং AST
পাইথন AST দুর্দান্ত; এটিই আমাদের শীর্ষে এমন একটি শক্তিশালী প্রকল্প লিখতে সক্ষম করেছে
পাইথন ছাড়া পাইথনকে খুব কঠিন লড়াই করতে হবে। যে কোনো কিছুর মতো, আমরা আমাদের ন্যায্য অংশ পেয়েছি
সমস্যা, এবং এখানে সাধারণ বিষয়গুলির একটি সংক্ষিপ্ত তালিকা রয়েছে যা আপনি পেতে পারেন৷
পাইথন আলাদা মধ্যে বিবৃতি এবং এক্সপ্রেশন.
এটি একটি বড় চুক্তির মতো শোনাতে পারে না -- আসলে, বেশিরভাগ পাইথন প্রোগ্রামারদের কাছে এটি হবে
শীঘ্রই একটি "ভাল, হ্যাঁ" মুহূর্ত হয়ে ওঠে।
পাইথনে, এরকম কিছু করা:
ছাপানো উন্নত x in পরিসর(10) পাস, কারণ ছাপানো প্রিন্ট এক্সপ্রেশন, এবং উন্নত একটি না
অভিব্যক্তি, এটি একটি নিয়ন্ত্রণ প্রবাহ বিবৃতি। ভালো জিনিস 1 + 1 এক্সপ্রেশন, যেমন আছে ল্যামডা
x: 1 + x, কিন্তু অন্যান্য ভাষার বৈশিষ্ট্য, যেমন if, উন্নত , বা যখন বিবৃতি হয়.
যেহেতু তাদের পাইথনের কোন "মূল্য" নেই, তাই কিছু করার পর থেকে এটি হাই-তে কাজ করা কঠিন করে তোলে
মত (ছাপা (যদি সত্য সত্য মিথ্যা)) শুধু সাধারণ নয়, এটি প্রত্যাশিত।
ফলস্বরূপ, আমরা একটি ব্যবহার করে জিনিসগুলিকে স্বয়ংক্রিয়ভাবে ম্যাঙ্গেল করি ফল বস্তু, যেখানে আমরা কোন অফার ast.stmt
যে রান পেতে প্রয়োজন, এবং একটি একক ast.expr যে যাই হোক না কেন মান পেতে ব্যবহার করা যেতে পারে
শুধু চালানো হয়েছিল। হাই চালানোর সময় জিনিষের জন্য অ্যাসাইনমেন্ট জোর করে এটি করে।
উদাহরণস্বরূপ, হাই:
(মুদ্রণ (যদি সত্য সত্য মিথ্যা))
পরিণত হবে:
যদি সত্য:
_mangled_name_here = সত্য
অন্য:
_mangled_name_here = মিথ্যা
_mangled_name_এখানে_প্রিন্ট করুন
ঠিক আছে, এটি কিছুটা মিথ্যা ছিল, যেহেতু আমরা আসলে সেই বিবৃতিটিকে এতে পরিণত করেছি:
মুদ্রণ সত্য যদি সত্য অন্যথা মিথ্যা
একটি মধ্যে জিনিস জোর করে ast.expr যদি আমরা পারি, তবে সাধারণ ধারণা ধরে রাখে।
ধাপ 4: পাইথন বাইটকোড আউটপুট এবং রানটাইম
আমাদের একটি পাইথন AST ট্রি সম্পূর্ণ হওয়ার পরে, আমরা এটি পাইথনে কম্পাইল করার চেষ্টা করতে পারি
এটি মাধ্যমে ঠেলাঠেলি দ্বারা bytecode স্পষ্ট. এখান থেকে, আমরা আর নিয়ন্ত্রণে নেই, এবং
পাইথন সবকিছুর যত্ন নিচ্ছে। এই কারণেই পাইথন ট্রেসব্যাক, পিডিবি এবং
জ্যাঙ্গো অ্যাপস কাজ করে।
Hy ম্যাক্রো
ব্যবহার gensym উন্নত নিরাপদ ম্যাক্রো
ম্যাক্রো লেখার সময়, বাহ্যিক ভেরিয়েবলগুলি ক্যাপচার করা বা ব্যবহার করা এড়াতে সতর্ক থাকতে হবে
পরিবর্তনশীল নাম যা ব্যবহারকারী কোডের সাথে বিরোধ করতে পারে।
আমরা একটি উদাহরণ ম্যাক্রো ব্যবহার করব NIF (দেখুন
http://letoverlambda.com/index.cl/guest/chap3.html#সেকেন্ড_৫ আরও সম্পূর্ণ বিবরণের জন্য।)
NIF একটি উদাহরণ, একটি সংখ্যার মত কিছু if, যেখানে অভিব্যক্তি উপর ভিত্তি করে, এক
অভিব্যক্তিটি ধনাত্মক, শূন্য বা ঋণাত্মক কিনা তার উপর নির্ভর করে 3টি ফর্ম বলা হয়।
প্রথম পাস এমন কিছু হতে পারে:
(ডিফম্যাক্রো এনআইএফ [এক্সপ্র পোস্ট-ফর্ম জিরো-ফর্ম নেগ-ফর্ম]
`(চলুন [[অস্পষ্ট-নাম ~এক্সপ্র]]
(cond [(pos? obscure-name) ~pos-form]
[(শূন্য? অস্পষ্ট-নাম) ~শূন্য-রূপ]
[(নেগ? অস্পষ্ট-নাম) ~নেগ-ফর্ম])))
কোথায় obsure-নাম অন্যের সাথে বিরোধ না করার জন্য কিছু পরিবর্তনশীল নাম বাছাই করার একটি প্রচেষ্টা
কোড তবে অবশ্যই, যদিও ভাল উদ্দেশ্য, এটি কোন গ্যারান্টি নয়।
পদ্ধতি জেনসিমটি এমন একটি উপলক্ষ্যের জন্য একটি নতুন, অনন্য প্রতীক তৈরি করার জন্য ডিজাইন করা হয়েছে।
এর অনেক ভালো সংস্করণ NIF হবে:
(ডিফম্যাক্রো এনআইএফ [এক্সপ্র পোস্ট-ফর্ম জিরো-ফর্ম নেগ-ফর্ম]
(চলুন [[জি (জেনসিম)]]
`(চলুন [[~g~expr]]
(cond [(pos? ~g) ~pos-form]
[(শূন্য? ~g) ~শূন্য-রূপ]
[(neg? ~g) ~neg-form]))))
এটি একটি সহজ কেস, যেহেতু শুধুমাত্র একটি প্রতীক আছে। তবে প্রয়োজন হলে বেশ কিছু
gensym এর একটি দ্বিতীয় ম্যাক্রো আছে-gensyms যা মূলত একটি সিরিজে প্রসারিত হয় দিন
বিবৃতি:
(gensyms সহ [a b c]
...)
এতে প্রসারিত হয়:
(আলো [[a (gensym))
[বি (জেনসিম)
[গ (জেনসিম)]]
...)
তাই আমাদের পুনরায় লিখিত NIF দেখতে হবে:
(ডিফম্যাক্রো এনআইএফ [এক্সপ্র পোস্ট-ফর্ম জিরো-ফর্ম নেগ-ফর্ম]
(gensyms সহ [g]
`(চলুন [[~g~expr]]
(cond [(pos? ~g) ~pos-form]
[(শূন্য? ~g) ~শূন্য-রূপ]
[(neg? ~g) ~neg-form]))))
অবশেষে, যদিও আমরা একটি নতুন ম্যাক্রো তৈরি করতে পারি যা আমাদের জন্য এই সব করে। ডিফম্যাক্রো/জি! গ্রহন করবে
সমস্ত প্রতীক যা দিয়ে শুরু হয় g! এবং স্বয়ংক্রিয়ভাবে কল করুন gensym বাকি সঙ্গে
প্রতীক তাই g!a হবে (জেনসিম "ক").
আমাদের চূড়ান্ত সংস্করণ NIF, দিয়ে নির্মিত ডিফম্যাক্রো/জি! হয়ে:
(defmacro/g! nif [expr pos-form zero-form neg-form]
`(চলুন [[~g!res ~expr]]
(cond [(pos? ~g!res) ~pos-form]
[(শূন্য? ~g!res) ~শূন্য-রূপ]
[(neg? ~g!res) ~neg-form]))))
পরীক্ষা করা হচ্ছে ম্যাক্রো আর্গুমেন্ট এবং উত্থাপন ব্যতিক্রমসমূহ
Hy সংকলনকারী অন্তর্নির্মিত ইন
CONTRIBUTOR এর মডিউল এর INDEX
সূচিপত্র:
অ্যানাফোরিক ম্যাক্রো
0.9.12 সংস্করণে নতুন।
অ্যানাফোরিক ম্যাক্রো মডিউল হাই-এ কার্যকরী প্রোগ্রামিংকে খুব সংক্ষিপ্ত এবং সহজ করে তোলে
পড়ুন।
একটি অ্যানাফোরিক ম্যাক্রো হল এক ধরনের প্রোগ্রামিং ম্যাক্রো যা ইচ্ছাকৃতভাবে কিছু ফর্ম ক্যাপচার করে
ম্যাক্রোতে সরবরাহ করা হয়েছে যা একটি অ্যানাফোর দ্বারা উল্লেখ করা যেতে পারে (একটি অভিব্যক্তি উল্লেখ করে
অন্যের প্রতি). — উইকিপিডিয়া (http://en.wikipedia.org/wiki/Anaphoric_macro)
ম্যাক্রো
ap-যদি
ব্যবহার: (এপি-যদি (foo) (ছাপা এটা))
সত্যতা জন্য প্রথম ফর্ম মূল্যায়ন, এবং এটি আবদ্ধ it সত্য এবং মিথ্যা উভয় ক্ষেত্রেই
শাখা.
ap-প্রতিটি
ব্যবহার: (ap-প্রতিটি [1 2 3 4 5] (ছাপা এটা))
পার্শ্ব-প্রতিক্রিয়ার জন্য তালিকার প্রতিটি উপাদানের ফর্ম মূল্যায়ন করুন।
ap-each-while
ব্যবহার: (ap-each-while তালিকা সামনে দেহ)
প্রতিটি উপাদানের জন্য ফর্ম মূল্যায়ন করুন যেখানে predicate ফর্ম ফিরে আসে সত্য.
=> (ap-each-while [1 2 3 4 5 6] (< এটি 4) (প্রিন্ট করুন))
1
2
3
ap-মানচিত্র
ব্যবহার: (এপি-ম্যাপ ফর্ম তালিকা)
মানচিত্রের অ্যানাফোরিক ফর্মটি ফাংশনের পরিবর্তে নিয়মিত মানচিত্রের মতোই কাজ করে
বস্তু এটি একটি Hy ফর্ম নেয়. বিশেষ নাম it থেকে বর্তমান বস্তুর সাথে আবদ্ধ
পুনরাবৃত্তি মধ্যে তালিকা.
=> (তালিকা (এপি-ম্যাপ (* এটি 2) [1 2 3]))
[2, 4, 6]
ap-map-when
ব্যবহার: (ap-map-when predfn খ্যাতি তালিকা)
কখন প্রয়োগ করতে হবে তা নির্ধারণ করতে একটি predicate ফাংশন ব্যবহার করে তালিকার উপর একটি ম্যাপিং মূল্যায়ন করুন
ফর্ম.
=> (তালিকা (এপি-ম্যাপ-যখন বিজোড়? (* এটি 2) [1 2 3 4]))
[১, ৩, ৫, ১]
=> (তালিকা (এপি-ম্যাপ-যখন এমনকি? (* এটি 2) [1 2 3 4]))
[১, ৩, ৫, ১]
এপি-ফিল্টার
ব্যবহার: (এপি-ফিল্টার ফর্ম তালিকা)
সঙ্গে ap-মানচিত্র এর উপাদানগুলিকে ফিল্টার করার জন্য আমরা একটি ফাংশনের পরিবর্তে একটি বিশেষ ফর্ম গ্রহণ করি
তালিকা বিশেষ নাম it পুনরাবৃত্তিতে বর্তমান উপাদানের সাথে আবদ্ধ।
=> (তালিকা (এপি-ফিল্টার (> (* এটি 2) 6) [1 2 3 4 5]))
[4, 5]
ap-প্রত্যাখ্যান
ব্যবহার: (এপি-প্রত্যাখ্যান ফর্ম তালিকা)
এই ফাংশন এর বিপরীত করে এপি-ফিল্টার, এটি পাসকারী উপাদানগুলিকে প্রত্যাখ্যান করে
পূর্বাভাস বিশেষ নাম it পুনরাবৃত্তিতে বর্তমান উপাদানের সাথে আবদ্ধ।
=> (তালিকা (এপি-প্রত্যাখ্যান (> (* এটি 2) 6) [1 2 3 4 5]))
[1, 2, 3]
ap-dotimes
ব্যবহার (ap-dotimes n দেহ)
এই ফাংশন শরীরের মূল্যায়ন করে n বার, বিশেষ পরিবর্তনশীল সহ it থেকে আবদ্ধ 0 থেকে
1-এন. এটি পার্শ্ব প্রতিক্রিয়া জন্য দরকারী।
=> (setv n [])
=> (ap-dotimes 3 (.append n it))
=> এন
[0, 1, 2]
ap-প্রথম
ব্যবহার (এপি-প্রথম predfn তালিকা)
এই ফাংশনটি প্রথম উপাদান প্রদান করে যা predicate পাস করে বা নাসঙ্গে
বিশেষ পরিবর্তনশীল it পুনরাবৃত্তিতে বর্তমান উপাদানের সাথে আবদ্ধ।
=>(এপি-প্রথম (> এটি 5) (পরিসীমা 10))
6
ap-শেষ
ব্যবহার (এপি-শেষ predfn তালিকা)
এই ফাংশনটি শেষ উপাদান প্রদান করে যা predicate বা পাস করে নাবিশেষ সঙ্গে
পরিবর্তনশীল it পুনরাবৃত্তিতে বর্তমান উপাদানের সাথে আবদ্ধ।
=>(এপি-শেষ (> এটি 5) (পরিসীমা 10))
9
ap-কমানো
ব্যবহার (ap-কমানো ফর্ম তালিকা &ঐচ্ছিক প্রাথমিক মান)
এই ফাংশনটি শরীরের প্রথম 2টি উপাদানে ফর্ম প্রয়োগ করার ফলাফল প্রদান করে এবং
তালিকাটি শেষ না হওয়া পর্যন্ত ফলাফল এবং 3য় উপাদান ইত্যাদি প্রয়োগ করা। ঐচ্ছিকভাবে একটি
প্রাথমিক মান সরবরাহ করা যেতে পারে তাই ফাংশনটি প্রাথমিক মান এবং তে প্রয়োগ করা হবে
পরিবর্তে প্রথম উপাদান। এই হিসাবে পুনরাবৃত্ত হচ্ছে উপাদান প্রকাশ it এবং বর্তমান
হিসাবে সঞ্চিত মান এক্সেসরিজ.
=>(এপি-রিডুস (+ এটি এসিসি) (পরিসীমা 10))
45
লুপ/পুনরাবৃত্ত
0.10.0 সংস্করণে নতুন।
সার্জারির লুপ / আবৃত্তি করা ম্যাক্রো প্রোগ্রামারদের টেল-কল অপ্টিমাইজেশান (TCO) ব্যবহার করার একটি সহজ উপায় দেয়
তাদের হাই কোডে।
একটি টেল কল হল একটি সাবরুটিন কল যা চূড়ান্ত হিসাবে অন্য পদ্ধতির মধ্যে ঘটে
কর্ম; এটি একটি রিটার্ন মান তৈরি করতে পারে যা কলিং দ্বারা অবিলম্বে ফেরত দেওয়া হয়
পদ্ধতি যদি কোন কল যে একটি সাবরুটিন সঞ্চালন, যেমন এটি অবশেষে নেতৃত্ব হতে পারে
এই একই সাবরুটিনে আবার কল চেইনের নিচে ডাকা হচ্ছে, টেইল পজিশনে আছে,
এই ধরনের একটি সাবরুটিনকে টেল-রিকারসিভ বলা হয়, যা পুনরাবৃত্তির একটি বিশেষ ক্ষেত্রে।
টেল কলগুলি উল্লেখযোগ্য কারণ সেগুলি একটি নতুন স্ট্যাক যোগ না করেই প্রয়োগ করা যেতে পারে৷
কল স্ট্যাকের ফ্রেম। বর্তমান পদ্ধতির বেশিরভাগ ফ্রেমের প্রয়োজন নেই
আরও, এবং এটি লেজ কলের ফ্রেম দ্বারা প্রতিস্থাপিত হতে পারে। প্রোগ্রাম তারপর লাফ দিতে পারে
নামক সাবরুটিনে। একটি আদর্শ কল ক্রম পরিবর্তে এই ধরনের কোড উত্পাদন করা হয়
টেল কল এলিমিনেশন বা টেল কল অপটিমাইজেশন বলা হয়। টেইল কল নির্মূল করার অনুমতি দেয়
গোটো স্টেটমেন্টের মতো দক্ষতার সাথে প্রয়োগ করতে টেইল পজিশনে পদ্ধতি কল করে,
এইভাবে দক্ষ কাঠামোগত প্রোগ্রামিং অনুমতি দেয়. — উইকিপিডিয়া (-
http://en.wikipedia.org/wiki/Tail_call)
ম্যাক্রো
লুপ
লুপ একটি পুনরাবৃত্তি বিন্দু স্থাপন করে। সঙ্গে লুপ, আবৃত্তি করা তে সেট করা ভেরিয়েবলকে রিবাইন্ড করে
রিকারশন পয়েন্ট এবং কোড এক্সিকিউশনকে সেই রিকারশন পয়েন্টে ফেরত পাঠায়। যদি আবৃত্তি করা ব্যবহার করা হয়
একটি অ-লেজ অবস্থান, একটি ব্যতিক্রম নিক্ষেপ করা হয়।
ব্যবহার: (লুপ বাইন্ডিং &বিশ্রাম দেহ)
উদাহরণ:
(hy.contrib.loop প্রয়োজন)
(defn ফ্যাক্টোরিয়াল [n]
(লুপ [[i n] [acc 1]]
(যদি (শূন্য? i)
এক্সেসরিজ
(পুনরাবৃত্তি (ডিসেম্বর i) (* acc i)))))
(গৌণিক 1000)
defmulti
0.10.0 সংস্করণে নতুন।
defmulti প্রদত্ত আর্গস এবং/অথবা কোয়ার্গের দ্বারা একটি ফাংশনকে অ্যারিটি-ওভারলোড করতে দেয়।
Clojure এর গ্রহণ দ্বারা অনুপ্রাণিত defn.
=> (hy.contrib.multi প্রয়োজন)
=> (অনেক মজা
... ([a] "a")
... ([ab] "ab")
... ([abc] "abc"))
=> (মজা 1)
"একটি"
=> (মজা 1 2)
"ক খ"
=> (মজা 1 2 3)
"abc"
হ্যাকিং ON HY
যোগদান আমাদের হাইভ!
হাই হ্যাক আসা দয়া করে!
অনুগ্রহ করে আমাদের সাথে আড্ডা দিন #হাই on irc.freenode.net!
এর সাথে টুইটারে এটি সম্পর্কে কথা বলুন #হাই হ্যাশট্যাগ!
এটা সম্পর্কে ব্লগ করুন!
অনুগ্রহ করে আপনার প্রতিবেশীর বেড়াতে এটি স্প্রে পেইন্ট করবেন না (সুন্দরভাবে জিজ্ঞাসা না করে)!
টাট্টু!
এটা কর:
1। একটা তৈরি কর ভার্চুয়াল পরিবেশ:
$ virtualenv venv
এবং এটি সক্রিয় করুন:
$ venv/bin/activate
বা ব্যবহার করুন virtualenvwrapper আপনার ভার্চুয়াল পরিবেশ তৈরি এবং পরিচালনা করতে:
$ mkvirtualenv hy
$ workon hy
2. সোর্স কোড পান:
$ git ক্লোন https://github.com/hylang/hy.git
অথবা আপনার কাঁটা ব্যবহার করুন:
it গিট ক্লোন [ইমেল সুরক্ষিত]: /hy.git
3. হ্যাকিংয়ের জন্য ইনস্টল করুন:
$ cd hy/
$ pip install -e.
4. অন্যান্য বিকাশ-y প্রয়োজনীয়তা ইনস্টল করুন:
$ pip install -r requirements-dev.txt
5. দুর্দান্ত জিনিসগুলি করুন; আপনি যা করেছেন তাতে আনন্দে/বিতৃষ্ণায় কাউকে চিৎকার করুন।
টেস্ট!
পরীক্ষায় অবস্থিত পরীক্ষা/। আমরা ব্যাবহার করি নাক.
পরীক্ষা চালানোর জন্য:
$ nosetests
পরীক্ষা লিখুন---পরীক্ষা ভাল!
এছাড়াও, সমর্থিত সমস্ত প্ল্যাটফর্মের জন্য এবং PEP 8 সম্মতির জন্য পরীক্ষা চালানো ভাল
কোড আপনি টক্স চালিয়ে এটি করতে পারেন:
$ টক্স
দলিল !
ডকুমেন্টেশন অবস্থিত ডক্স/। আমরা ব্যাবহার করি স্পিংক্স.
HTML এ ডক্স তৈরি করতে:
$ cd ডক্স
$ html তৈরি করুন
ডক্স লিখুন---ডক্স ভাল! এমনকি এই ডক!
অবদান
অবদানগুলিকে স্বাগত জানাই এবং অত্যন্ত প্রশংসা করা হয়, প্রতিটি সামান্য বিট Hy আরও তৈরি করতে সাহায্য করে৷
অসাধারণ.
অনুরোধ টান মহান! আমরা তাদের ভালবাসি; এখানে একটি দ্রুত গাইড:
· রেপো ফোর্ক করুন এবং একটি বৈশিষ্ট্য/ফিক্সের জন্য একটি বিষয় শাখা তৈরি করুন। সরাসরি পরিবর্তন করা এড়িয়ে চলুন
মাস্টার শাখায়।
· সমস্ত ইনকামিং বৈশিষ্ট্য পরীক্ষার সঙ্গে অনুষঙ্গী করা উচিত.
· আপনি একটি PR জমা দেওয়ার আগে, অনুগ্রহ করে পরীক্ষা চালান এবং শৈলীর বিপরীতে আপনার কোড পরীক্ষা করুন
গাইড আপনি একবারে এই দুটি জিনিস করতে পারেন:
$বান d
· যৌক্তিক ইউনিটে প্রতিশ্রুতি তৈরি করুন, যাতে পরবর্তীতে ট্র্যাক করা এবং নেভিগেট করা সহজ হয়। আগে
একটি PR জমা দিয়ে, কমিটগুলিকে পরিবর্তনসেটগুলিতে স্কোয়াশ করার চেষ্টা করুন যেগুলিতে ফিরে আসা সহজ
পরে এছাড়াও, নিশ্চিত করুন যে আপনি পরিবর্তনসেটগুলিতে জাল হোয়াইটস্পেস ছেড়ে যাবেন না; এই
পরে হোয়াইটস্পেস ফিক্স কমিট তৈরি করা এড়িয়ে যায়।
· যতদূর কমিট বার্তা যায়, নিম্নলিখিতগুলি মেনে চলার চেষ্টা করুন:
· গিট কমিট বার্তাগুলির প্রথম লাইনের জন্য 50 অক্ষর সীমাতে লেগে থাকার চেষ্টা করুন।
· আরো বিস্তারিত/ব্যাখ্যার জন্য, একটি ফাঁকা লাইন দিয়ে এটি অনুসরণ করুন এবং চালিয়ে যান
প্রতিশ্রুতি বিস্তারিতভাবে বর্ণনা করা।
· অবশেষে, নিজেকে লেখক ফাইলে যুক্ত করুন (একটি পৃথক প্রতিশ্রুতি হিসাবে): আপনি এটি প্রাপ্য :)
· সমস্ত আগত পরিবর্তনগুলি হাইলাং-এর মূল দলের 2 জন ভিন্ন সদস্যের দ্বারা স্বীকার করা প্রয়োজন।
অতিরিক্ত পর্যালোচনা পরিষ্কারভাবে স্বাগত, কিন্তু আমাদের যেকোনোটির জন্য ন্যূনতম 2টি সাইনঅফ প্রয়োজন৷
পরিবর্তন.
· যদি একটি মূল সদস্য একটি পিআর পাঠায়, অনুগ্রহ করে 2 মূল সদস্যদের খুঁজুন যেগুলি অন্তর্ভুক্ত নয়
জনসংযোগ জমাকারী। এখানে ধারণা হল যে একজন PR লেখকের সাথে কাজ করতে পারে, এবং একটি দ্বিতীয় অ্যাকস
সম্পূর্ণ পরিবর্তন সেট।
· ডকুমেন্টেশন এবং অন্যান্য তুচ্ছ পরিবর্তনের জন্য, আমরা এক ACK পরে একত্রিত করা ভাল। আমরা পেয়েছি
কম কভারেজ, তাই সেই বাধা কম রাখা ভালো হবে।
মূল টীম
Hy এর মূল উন্নয়ন দল নিম্নলিখিত বিকাশকারীদের নিয়ে গঠিত:
· জুলিয়েন Danjou
· Morten লিন্ডারুড
· J কেনেথ রাজা
· জার্জেলি নাগি
· তুউক্কা টার্টো
· কারেন রুস্তাদ
· অভিষেক L
· ক্রিস্টোফার অ্যালান Webber
· কনরাড হিনসেন
· ইচ্ছা কান-গ্রিন
· পল ট্যাগলিয়ামন্টে
· নিকোলাস ড্যান্ড্রিমন্ট
· দোলক টলবার্ট
· বার্কার পেকসাগ
· ক্লিনটন N. ড্রেসবাখ
· হ্যান সেমাজ
onworks.net পরিষেবা ব্যবহার করে hy অনলাইন ব্যবহার করুন