عربيالفرنسيةالإسبانية

Ad


OnWorks فافيكون

hy - عبر الإنترنت في السحابة

قم بتشغيل hy في موفر الاستضافة المجاني OnWorks عبر Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

هذا هو الأمر الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

برنامج:

اسم


hy - hy التوثيق [الصورة: Hy] [الصورة]

جرّب Hy https://try-hy.appspot.com

PyPI https://pypi.python.org/pypi/hy

مصدر https://github.com/hylang/hy

قائمة مناقشة hylang

IRC #هي على فرينود

البناء الحالة
ترافيس CI.إلغاء المسافة البادئة

Hy هي لهجة رائعة من لغة Lisp وهي مضمنة في لغة Python.

منذ أن قامت Hy بتحويل كود Lisp الخاص بها إلى Python Abstract Syntax Tree، فقد قمت بذلك
عالم بايثون الجميل كله في متناول يدك، في شكل ليسب!

المحتويات:

بداية سريعة


[الصورة: حضن كارين روستارد] [الصورة]

(شكرًا لكارين رستاد على Cuddles!)

HOW إلى للحصول على HY ريال FAST:

1. إنشاء افتراضي بايثون البيئة.

2. قم بتنشيط بيئة بايثون الافتراضية الخاصة بك.

3. تثبيت hy تبدأ من PyPI مع بذرة تثبيت hy.

4. ابدأ REPL باستخدام hy.

5. اكتب الأشياء في REPL:

=> (اطبع "Hy!")
يا!
=> (defn salutationsnm [name] (طباعة (+ "Hy " name "!"))))
=> (تحية "اسمك")
هاي اسمك!

إلخ

6. اضغط على CTRL-D عند الانتهاء.

يا الهي! هذا مدهش! I تريد إلى اكتب a Hy برنامج.

7. افتح محرر برمجة النخبة واكتب:

(اطبع "كنت سأقوم بالبرمجة باستخدام بناء جملة بايثون، ولكن بعد ذلك حصلت على Hy.")

8. حفظ باسم hy.

9. وقم بتشغيل برنامج Hy الأول:

مرحباً رائع

10
خذ نفساً عميقاً حتى لا تتنفس بشكل مفرط.

11
ابتسم بخبث وتسلل إلى مخبئك وافعل أشياء لا توصف.

TUTORIAL


مرحبًا بك في البرنامج التعليمي Hy!

باختصار، Hy هي لهجة Lisp، ولكنها تحول بنيتها إلى لغة Python...
حرفيًا تحويل إلى شجرة بناء الجملة المجردة في بايثون! (أو لوضعها في مزيد من الخام
المصطلحات، Hy عبارة عن lisp-stick في Python!)

هذا رائع جدًا لأنه يعني أن Hy عبارة عن عدة أشياء:

· اللثغة التي تبدو بايثونية للغاية

· بالنسبة لـ Lispers، طريقة رائعة لاستخدام قوى Lisp المجنونة ولكن في عالم Python الواسع
المكتبات (لماذا نعم، يمكنك الآن كتابة تطبيق Django في Lisp!)

· بالنسبة إلى Pythonistas، إنها طريقة رائعة لبدء استكشاف Lisp، من خلال لغة Python المريحة!

· للجميع: لغة ممتعة وفيها الكثير من الأفكار الرائعة!

الباقة الأساسية مقدمة إلى لثغة For بايثونستاس
حسنًا، ربما لم تستخدم Lisp من قبل، لكنك استخدمت Python!

برنامج "hello World" في Hy هو في الواقع بسيط للغاية. دعنا نحاول:

(طباعة "مرحبا بالعالم")

يرى؟ سهل! كما كنت قد خمنت، هذا هو نفس إصدار بايثون من:

طباعة "مرحبا بالعالم"

لإضافة بعض الرياضيات البسيطة للغاية، يمكننا القيام بما يلي:

(+1 3)

والذي سيرجع 4 وسيكون معادلاً لـ:

1 + 3

ما ستلاحظه هو أن العنصر الأول في القائمة هو الوظيفة التي يتم استدعاؤها و
بقية الحجج هي الحجج التي يتم تمريرها. في الواقع، في Hy (كما هو الحال مع معظم
Lisps) يمكننا تمرير وسيطات متعددة إلى عامل التشغيل plus:

(+1 3 55)

الذي سوف يعود 59

ربما سمعت عن Lisp من قبل ولكنك لا تعرف الكثير عنها. Lisp ليست صعبة مثلك
قد يظن أن Hy يرث من Python، لذا فإن Hy طريقة رائعة لبدء تعلم Lisp.
الشيء الرئيسي الواضح في Lisp هو وجود الكثير من الأقواس. هذا يمكن
قد يبدو الأمر مربكًا في البداية، لكنه ليس بالأمر الصعب. دعونا نلقي نظرة على بعض الرياضيات البسيطة
ملفوفة في مجموعة من الأقواس التي يمكننا إدخالها في مترجم Hy:

(نتيجة السيتف (- (/ (+1 3 88) 2) 8))

هذا من شأنه أن يعيد 38. لكن لماذا؟ حسنًا، يمكننا أن ننظر إلى التعبير المكافئ في
الثعبان:

النتيجة = ((1 + 3 + 88) / 2) - 8

إذا كنت تحاول معرفة كيفية عمل ما ورد أعلاه في لغة بايثون، فستفعل ذلك بالطبع
معرفة النتائج عن طريق حل كل قوس داخلي. هذه هي نفس الفكرة الأساسية في
هاي. لنجرب هذا التمرين أولاً في بايثون:

النتيجة = ((1 + 3 + 88) / 2) - 8
#مبسطة...
النتيجة = (92 / 2) - 8
#مبسطة...
النتيجة = 46 - 8
#مبسطة...
النتيجة = 38

الآن دعونا نجرب نفس الشيء في Hy:

(نتيجة السيتف (- (/ (+1 3 88) 2) 8))
; مبسطة ل...
(نتيجة السيت في (- (/ 92 2) 8))
; مبسطة ل...
(نتيجة السيتف (- 46 8))
; مبسطة ل...
(نتيجة سيتف 38)

كما خمنت على الأرجح، هذا التعبير الأخير هو setv يعني تعيين المتغير
"النتيجة" إلى 38

يرى؟ ليس من الصعب جدا!

هذا هو المنطلق الأساسي لـ Lisp. Lisp تعني "معالجة القائمة"؛ وهذا يعني أن
هيكل البرنامج هو في الواقع قوائم القوائم. (إذا كنت معتادًا على لغة بايثون
القوائم، تخيل نفس البنية بأكملها كما هو مذكور أعلاه ولكن مع الأقواس المربعة بدلاً من ذلك، أي
ستتمكن من رؤية البنية أعلاه كبرنامج وبنية بيانات.) هذا هو
أسهل للفهم مع المزيد من الأمثلة، لذلك دعونا نكتب برنامج بايثون بسيط ونختبره،
ثم قم بإظهار برنامج Hy المكافئ:

تعريف محادثة بسيطة ():
طباعة "مرحبًا! أود التعرف عليك. أخبرني عن نفسك!"
الاسم = Raw_input ("ما اسمك؟")
age = Raw_input("ما هو عمرك؟")
اطبع "مرحبًا " + اسمك + "! أرى أنك تبلغ من العمر " + عمرك + " عامًا."

محادثة_بسيطة()

إذا قمنا بتشغيل هذا البرنامج، فقد يصبح مثل:

مرحبًا! أود التعرف عليك. حدثني عن نفسك!
ما اسمك؟ غاري
ما هو عمرك؟ 38
مرحبا غاري! أرى أن عمرك 38 عامًا.

الآن دعونا نلقي نظرة على برنامج Hy المكافئ:

(تعريف المحادثة البسيطة []
(اطبع "مرحبًا! أود التعرف عليك. أخبرني عن نفسك!")
(اسم setv (الإدخال الأولي "ما اسمك؟"))
(عمر setv (المدخلات الأولية "ما هو عمرك؟"))
(طباعة (+ "مرحبًا" الاسم "! أرى أنك كذلك ")
العمر "سنوات.")))

(محادثة بسيطة)

إذا نظرت إلى البرنامج أعلاه، طالما أنك تتذكر العنصر الأول في كل منهما
قائمة البرنامج هي الوظيفة (أو الماكرو... سنصل إليها لاحقًا) التي يتم استدعاؤها
وأن الباقي عبارة عن حجج، فمن السهل جدًا معرفة ما يعنيه كل هذا.
(كما خمنت على الأرجح، ديفين هي طريقة Hy لتحديد الطرق.)

ومع ذلك، يجد الكثير من الأشخاص هذا الأمر مربكًا في البداية نظرًا لوجود الكثير من الأقواس،
ولكن هناك الكثير من الأشياء التي يمكن أن تساعد في تسهيل ذلك: حافظ على المسافة البادئة لطيفة و
استخدم محررًا مع مطابقة الأقواس (سيساعدك هذا في معرفة ما هو كل منها
تقترن الأقواس مع) وستبدأ الأمور في الشعور بالراحة.

هناك بعض المزايا لامتلاك بنية تعليمات برمجية تكون في الواقع عبارة عن بيانات بسيطة جدًا
الهيكل الذي يعتمد عليه جوهر Lisp. لشيء واحد، فهذا يعني أن برامجك
من السهل تحليلها وأن البنية الفعلية الكاملة للبرنامج مكشوفة بشكل واضح للغاية
لك. (هناك خطوة إضافية في hy حيث يتم تحويل البنية التي تراها إلى بنية Python
التمثيلات الخاصة ... في Lisps "الأكثر نقاءً" مثل Common Lisp أو Emacs Lisp، البيانات
البنية التي تراها في الكود وبنية البيانات التي يتم تنفيذها أكثر من ذلك بكثير
قريب حرفيا.)

الآثار الأخرى لهذا هي وحدات الماكرو: إذا كانت بنية البرنامج عبارة عن بيانات بسيطة
البنية، وهذا يعني أنه يمكنك كتابة التعليمات البرمجية التي يمكنها كتابة التعليمات البرمجية بسهولة شديدة، وهذا يعني ذلك
يمكن أن يكون تنفيذ ميزات اللغة الجديدة تمامًا سريعًا جدًا. قبل Hy، لم يكن هذا
ممكن جدًا لمبرمجي بايثون... الآن يمكنك أيضًا الاستفادة من وحدات الماكرو المذهلة
القوة (فقط احرص على عدم توجيههم للأمام)!

Hy is a بنكهة اللثغة بايثون
يتحول Hy إلى شجرة بناء الجملة المجردة الخاصة ببايثون، لذلك ستبدأ قريبًا في العثور على كل ذلك
القوة المألوفة للبايثون في متناول يدك.

لديك حق الوصول الكامل إلى أنواع بيانات Python والمكتبة القياسية في Hy. دعونا نجرب
مع هذا في مترجم hy:

=> [1 2 3]
[1 و 2 و 3]
=> {"الكلب" "النباح"
... "قطة" "مواء"}

{'كلب': 'ينبح'، 'قطة': 'مواء'}
=> (، 1 2 3)
(1، 2، 3)

إذا كنت معتادًا على Lipss الأخرى، فقد تكون مهتمًا بأن Hy يدعم Common
طريقة Lisp في الاقتباس:

=> '(1 2 3)
(1 لتر 2 لتر 3 لتر)

يمكنك أيضًا الوصول إلى الأساليب الرائعة لجميع الأنواع المضمنة:

=> (.strip " fooooo ")
"فوووو"

ما هذا؟ نعم بالفعل، هذا هو بالضبط نفس:

" fooooo ".strip ()

هذا صحيح --- اللثغة مع تدوين نقطة! إذا تم تعيين هذه السلسلة كمتغير، فإننا
يمكن أيضًا القيام بما يلي:

(setv هذه السلسلة "fooooo")
(هذا-string.strip)

ماذا عن الشرط؟:

(إذا (جرب شيئًا ما)
(اطبع "هذا إذا كان صحيحًا")
(اطبع "هذا إذا كان خطأ")

كما يمكنك أن تقول أعلاه، الحجة الأولى ل if هو اختبار الحقيقة، والحجة الثانية هي
الجسم إذا كان صحيحا، والوسيطة الثالثة (اختياري!) هي إذا كاذبة (أي. آخر).

إذا كنت بحاجة إلى تنفيذ شروط أكثر تعقيدًا، فستجد أنك لا تملكها أليف
متوفر في هاي. بدلا من ذلك، يجب عليك استخدام شيء يسمى كوند. في بايثون، قد تفعل ذلك
شيء مثل:

سوفار = 33
إذا كان بعض فار > 50:
طباعة "هذا المتغير كبير جدًا!"
إليف سوفار < 10:
طباعة "هذا المتغير صغير جدًا!"
آخر:
طباعة "هذا المتغير هو حق jussssst!"

في Hy، ستفعل:

(شرطي
[(> في بعض الأحيان 50)
(اطبع "هذا المتغير كبير جدًا!")]
[(< في بعض الأحيان 10)
(اطبع "هذا المتغير صغير جدًا!")]
[حقيقي
(طباعة "هذا المتغير هو حق jussssst!")])

ما ستلاحظه هو ذلك كوند ينطفئ بين بعض العبارات التي يتم تنفيذها و
يتم التحقق بشكل مشروط من صحة أو خطأ، ثم القليل من التعليمات البرمجية للتنفيذ إذا تم تشغيله
ليكون صحيحا. ستلاحظ أيضًا أن آخر يتم تنفيذه في النهاية ببساطة عن طريق
التحقق من صحيح -- ذلك بسبب صحيح سيكون دائمًا صحيحًا، لذا إذا وصلنا إلى هذا الحد، فسنفعل ذلك
دائما تشغيل هذا واحد!

قد تلاحظ أعلاه أنه إذا كان لديك رمز مثل:

(إذا كان بعض الشرط
(الجسم إذا كان صحيحا)
(الجسم إذا كان كاذبا))

لكن انتظر! ماذا لو كنت تريد تنفيذ أكثر من عبارة في نص واحدة منها
هؤلاء؟

يمكنك القيام بما يلي:

(إذا (جرب شيئًا ما)

(اطبع "هذا إذا كان صحيحًا")
(طباعة "ولماذا لا، دعونا نواصل الحديث عن مدى صحتها!))
(اطبع "هذا لا يزال مجرد خطأ"))

يمكنك أن ترى أننا استخدمنا do لالتفاف بيانات متعددة. إذا كنت على دراية بأخرى
ليسبس، وهذا يعادل com.prog في مكان آخر.

تبدأ التعليقات بفواصل منقوطة:

(اطبع "سيتم تشغيل هذا")
; (طباعة "ولكن هذا لن")
(+1 2 3) ؛ سنقوم بتنفيذ الإضافة، ولكن ليس هذا التعليق!

التكرار ليس بالأمر الصعب ولكن له نوع من البنية الخاصة. في بايثون، يمكننا القيام بما يلي:

لأني في نطاق(10):
طباعة "'i' الآن في" + str(i)

المعادل في Hy سيكون:

(لـ [i (النطاق 10)]
(طباعة (+ "'i' الآن في " (str i))))

يمكنك أيضًا استيراد مكتبات Python المختلفة والاستفادة منها. على سبيل المثال:

(استيراد نظام التشغيل)

(إذا كان (os.path.isdir "/tmp/somedir")
(os.mkdir "/tmp/somedir/anotherdir")
(اطبع "مرحبًا، هذا المسار ليس موجودًا!"))

مديرو سياق بايثون (مع البيانات) تستخدم مثل هذا:

(مع [[f (فتح "/tmp/data.in")]]
(طباعة (.اقرأ و)))

وهو ما يعادل:

مع open("/tmp/data.in") كـ f:
طباعة f.قراءة ()

ونعم، لدينا فهم القائمة! في بايثون يمكنك القيام بما يلي:

احتمالات_مربع = [
الأسرى (عدد، 2)
للرقم في نطاق(100)
إذا كان العدد % 2 == 1]

في Hy، يمكنك القيام بما يلي:

(مربع احتمالات setv
(قائمة شركات
(القوة رقم 2)
(الرقم (النطاق 100))
(= (% عدد 2) 1)))

; ومثال مسروق بلا خجل من صفحة Clojure:
; دعونا ندرج جميع الكتل الموجودة على رقعة الشطرنج:

(قائمة شركات
(، س ص)
(x (النطاق 8)
ص "ABCDEFGH"))

; [(0، 'أ')، (0، 'ب')، (0، 'ج')، (0، 'د')، (0، 'ه')، (0، 'و')، ( 0، 'ز')، (0، 'ح')،
; (1، 'أ')، (1، 'ب')، (1، 'ج')، (1، 'د')، (1، 'ه')، (1، 'و')، (1 ، 'ز')، (1، 'ح')،
; (2، 'أ')، (2، 'ب')، (2، 'ج')، (2، 'د')، (2، 'ه')، (2، 'و')، (2 ، 'ز')، (2، 'ح')،
; (3، 'أ')، (3، 'ب')، (3، 'ج')، (3، 'د')، (3، 'ه')، (3، 'و')، (3 ، 'ز')، (3، 'ح')،
; (4، 'أ')، (4، 'ب')، (4، 'ج')، (4، 'د')، (4، 'ه')، (4، 'و')، (4 ، 'ز')، (4، 'ح')،
; (5، 'أ')، (5، 'ب')، (5، 'ج')، (5، 'د')، (5، 'ه')، (5، 'و')، (5 ، 'ز')، (5، 'ح')،
; (6، 'أ')، (6، 'ب')، (6، 'ج')، (6، 'د')، (6، 'ه')، (6، 'و')، (6 ، 'ز')، (6، 'ح')،
; (7، 'أ')، (7، 'ب')، (7، 'ج')، (7، 'د')، (7، 'ه')، (7، 'و')، (7 ، 'G')، (7، 'H')]

تدعم Python العديد من الحجج الرائعة ووسائط الكلمات الرئيسية. في بايثون قد نفعل ذلك
نرى:

>>> def Optional_arg(pos1, pos2,keyword1=None,keyword2=42):
... العودة [pos1، pos2، الكلمة الأساسية 1، الكلمة الأساسية 2]

>>> اختياري_arg(1, 2)
[1، 2، لا شيء، 42]
>>> اختياري_arg(1, 2, 3, 4)
[1 ، 2 ، 3 ، 4]
>>> Option_arg(keyword1=1, pos2=2, pos1=3, الكلمة الرئيسية2=4)
[3 ، 2 ، 1 ، 4]

نفس الشيء في هاي:

=> (defn الاختياري-arg [pos1 pos2 والكلمة الأساسية الاختيارية 1 [keyword2 42]]
... [pos1 pos2 الكلمة الأساسية 1 الكلمة الأساسية 2])
=> (اختياري-الوسيطة 1 2)
[1 2 لا يوجد 42]
=> (اختياري-الوسيط 1 2 3 4)
[1 2 3]

إذا كنت تقوم بتشغيل إصدار Hy السابق 0.10.1 (على سبيل المثال، git master)، فهناك أيضًا إصدار جديد رائع
بناء جملة وسيطة الكلمة الرئيسية:

=> (اختياري-arg :keyword1 1
...:النقطة 2 2
...:النقطة 1 3
... :الكلمة الرئيسية2 4)
[3 ، 2 ، 1 ، 4]

خلاف ذلك، يمكنك دائما استخدام تطبيق. ولكن ما تطبيق?

هل أنت على دراية بالمرور * أرغس و ** kwargs في بايثون؟:

>>> الوسائط = [1 2]
>>> كوارجس = {"keyword2": 3
... "الكلمة الرئيسية 1": 4}
>>> Option_arg(*args, **kwargs)

يمكننا إعادة إنتاج هذا مع تطبيق:

=> (وسيطات setv [1 2])
=> (سيتف كوارجس {"keyword2" 3
... "الكلمة الرئيسية 1" 4})
=> (تطبيق اختياري-args kwargs)
[1 ، 2 ، 4 ، 3]

هناك أيضًا بنية وسيطات للكلمات الرئيسية على نمط القاموس تبدو كما يلي:

(تعريف نمط آخر [&key {"key1" "val1" "key2" "val2"}]
[مفتاح1 مفتاح2])

الفرق هنا هو أنه بما أنه قاموس، فلا يمكنك الاعتماد على أي قاموس محدد
ترتيب للحجج.

يدعم Hy أيضًا * أرغس و ** kwargs. في بايثون:

حدد some_func(foo, bar, *args, **kwargs):
استيراد بطباعة
pprint.pprint ((foo، bar، args، kwargs))

المعادل Hy:

(defn some-func [foo bar &rest args &kwargs kwargs]
(استيراد بطباعة)
(pprint.pprint (، foo bar args kwargs)))

وأخيرا، بالطبع نحن بحاجة إلى دروس! في بايثون، قد يكون لدينا فئة مثل:

فئة FooBar (كائن):
"" "
فئة مثال أخرى
"" "
تعريف __init__(الذات، x):
self.x = x

مواطنة get_x (الذات):
"" "
أعد نسختنا من x
"" "
العودة الذاتية.x

في هاي:

(إلغاء تصنيف FooBar [كائن]
""فئة مثال أخرى""
[[--فيه--
(الجبهة الوطنية [الذات س]
(سيتف self.xx)
; مطلوب حاليًا لـ --init-- لأن __init__ لا يحتاج إلى أي شيء
; نأمل أن يختفي هذا :)
لا أحد)]

[الحصول على س
(الجبهة الوطنية [الذات]
"أعد نسختنا من x"
النفس.x)]])

يمكنك أيضًا عمل سمات على مستوى الفصل. في بايثون:

فئة العملاء (models.Model):
الاسم =models.CharField(max_length=255)
العنوان = نماذج.TextField ()
الملاحظات = نماذج.TextField ()

في هاي:

(إلغاء تصنيف العميل [models.Model]
[[الاسم (models.CharField: الحد الأقصى للطول 255})]
[العنوان (النماذج.TextField)]
[ملاحظات (نماذج.TextField)]])

Hy <-> بايثون إمكانية التشغيل المتداخل
من خلال استيراد Hy، يمكنك استخدام Hy مباشرة من Python!

إذا قمت بحفظ ما يلي في تحياتي.hy:

(defn Greeting [name] (اطبع "hello from hy،" name))

ثم يمكنك استخدامه مباشرة من بايثون، عن طريق استيراد hy قبل استيراد الوحدة. في
بايثون:

استيراد hy
تحيات الاستيراد

تحياتي.ترحيب ("فو")

يمكنك أيضًا الإعلان عن وظيفة في python (أو حتى فئة!) واستخدامها في Hy!

إذا قمت بحفظ ما يلي في تحياتي.py في بايثون:

تحية محددة (الاسم):
طباعة ("مرحبًا، %s" % (الاسم))

يمكنك استخدامه في Hy:

(تحية الاستيراد)
(.تحية تحية "فو")

لاستخدام وسيطات الكلمات الرئيسية، يمكنك استخدامها في تحياتي.py:

تحية بالتأكيد (الاسم، العنوان = "سيدي"):
طباعة ("تحياتي، %s %s" % (العنوان، الاسم))

(تحية الاستيراد)
(.تحية تحية "فو")
(.تحية تحية "فو" "دارث")
(تطبيق (. تحية طيبة) ["Foo"] {"title" "يا رب"})

والتي من شأنها إخراج:

تحياتي لك سيد فو

تحياتي دارث فو

تحياتي يا سيد فو

بروتيبس!
تتميز Hy أيضًا بشيء يُعرف باسم "الماكرو الخيطي"، وهي ميزة رائعة حقًا
كلوجر. "ماكرو الترابط" (مكتوب باسم ->) يستخدم لتجنب التداخل العميق لـ
التعبيرات.

يقوم ماكرو الترابط بإدراج كل تعبير في الوسيطة الأولى للتعبير التالي
مكان.

لنأخذ الكلاسيكية:

(حلقة (طباعة (تقييم (قراءة))))

وبدلا من كتابتها بهذه الطريقة، يمكننا كتابتها على النحو التالي:

(-> (قراءة) (تقييم) (طباعة) (حلقة))

الآن ، باستخدام بيثون-sh، يمكننا إظهار كيفية عمل ماكرو الترابط (بسبب إعداد python-sh)
يمكن استخدامها مثل الأنابيب:

=> (استيراد [sh [cat grep wc]])
=> (-> (cat "/usr/share/dict/words") (grep "-E" "^hy") (wc "-l"))
210

والذي بالطبع يمتد إلى:

(wc (grep (cat "/usr/share/dict/words") "-E" "^hy") "-l")

أكثر قابلية للقراءة، أليس كذلك؟ استخدم ماكرو الترابط!

HY STYLE دليل إرشادي


"كما تعلم أيها الوزير، أنا لا أتفق مع دمبلدور في العديد من النواحي... لكن لا يمكنك إنكار ذلك
حصلت على أسلوب..." - فينياس نيجيلوس بلاك، هاري خزاف و ال الطلب of ال عنقاء

يهدف دليل أسلوب Hy إلى أن يكون مجموعة من القواعد الأساسية لـ Hyve (نعم، مجتمع Hy
تفتخر بإلحاق Hy بكل شيء) لكتابة رمز Hy الاصطلاحي. Hy تستمد الكثير
من Clojure وCommon Lisp، مع الحفاظ دائمًا على إمكانية التشغيل التفاعلي لـ Python.

مقدمة
تاو of Hy
سأل أمون رئيس الرهبان: "ما هي السوترا التي تحاضر فيها؟"
"النيرفانا سوترا."
"إن نيرفانا سوترا لديها الفضائل الأربع، أليس كذلك؟"
"لقد حدث."
سأل أمون وهو يلتقط الكأس: كم من فضيلة هذه؟
قال الراهب: "لا شيء على الإطلاق".
"لكن القدماء قالوا أنه كان كذلك، أليس كذلك؟" قال أمون.
"ما رأيك فيما قالوا؟"
ضرب أمون الكأس وسأل: "هل تفهم؟"
"لا"، قال الراهب.
قال أمون: "إذاً، من الأفضل أن تستمر في محاضراتك حول السوترا."
- الماكرو (كوان).

يوضح ما يلي قائمة مختصرة بقرارات التصميم التي تم اتخاذها أثناء اتخاذ القرار
هاي.

· تبدو مثل اللثغة. DTRT معها (على سبيل المثال، تتحول الشرطات إلى شرطة سفلية، وتتحول أغطية الأذن إلى
جميع الحروف الكبيرة).

· ما زلنا بايثون. تترجم معظم الأجزاء الداخلية 1:1 إلى لغة Python الداخلية.

· استخدم Unicode في كل مكان.

· إصلاح القرارات السيئة في بايثون 2 عندما نستطيع (انظر true_division).

· عندما تكون في شك، ارجع إلى بايثون.

· إذا كنت لا تزال غير متأكد، قم بالتأجيل إلى Clojure.

· إذا كنت غير متأكد أكثر، فارجع إلى Common Lisp.

· نضع في اعتبارنا أننا لسنا Clojure. نحن لسنا ليسب المشتركة. نحن بيثون Homoiconic، مع
البتات الإضافية التي لها معنى.

تصميم & تسنن
· تجنب المسافات الزائدة. إنهم تمتص!

· يجب أن تكون المسافة البادئة مسافتين (لا توجد علامات تبويب صلبة)، إلا عند مطابقة المسافة البادئة
السطر السابق.

؛؛ جيد (والمفضل)
(تعريف الأكذوبة [ن]
(إذا (<= ن 2)
n
(+ (كذب (- ن 1)) (كذب (- ن 2)))))

؛؛ لا يزال بخير
(تعريف الأكذوبة [ن]
(إذا (<= n 2) n (+ (كفي (- n 1)) (كفي (- n 2)))))

؛؛ لا يزال بخير
(تعريف الأكذوبة [ن]
(إذا (<= ن 2)
n
(+ (كذب (- ن 1)) (كذب (- ن 2)))))

؛؛ مثير للسخرية بشكل هستيري
(تعريف الأكذوبة [ن]
(إذا (<= ن 2)
ن ؛؛ نعم، أحب الضغط على مفتاح المسافة بشكل عشوائي
(+ (كذب (- ن 1)) (كذب (- ن 2)))))

· يجب بين قوسين أبدا أن يُتركوا وحيدين، حزينين ووحيدين على خطهم الخاص.

؛؛ جيد (والمفضل)
(تعريف الأكذوبة [ن]
(إذا (<= ن 2)
n
(+ (كذب (- ن 1)) (كذب (- ن 2)))))

؛؛ مثير للسخرية بشكل هستيري
(تعريف الأكذوبة [ن]
(إذا (<= ن 2)
n
(+ (كذب (- ن 1)) (كذب (- ن 2)))
)
) ; جاه، احرقها بالنار

· محاذاة عموديا اسمحوا كتل.

(دع [[فو (شريط)]
[كوكس (باز)]]
(فو كوكس))

· يجب أن تكون التعليقات المضمنة عبارة عن مسافتين من نهاية الكود؛ يجب أن يكون لديهم دائمًا
مسافة بين حرف التعليق وبداية التعليق. حاول أيضًا ألا تفعل ذلك
تعليق واضح.

؛؛ جيد
(setv ind (dec x)) ; الفهرسة تبدأ من 0

؛؛ متوافق مع الأسلوب ولكنه ينص فقط على ما هو واضح
(setv ind (dec x)) ; يضبط الفهرس على x-1

؛؛ سيء
(setv ind (dec x))؛كتابة الكلمات من أجل المتعة

البرمجة الطراز
· كاتفاقية، حاول عدم استخدامها صفر لأي شيء آخر غير المتغيرات العالمية؛ يستخدم setv
الوظائف الداخلية والحلقات وما إلى ذلك.

؛؛ جيد (والمفضل)
(التعريف *الحد* 400000)

(تعريف الأكاذيب [أ ب]
(احيانا صحيح
(العائد أ)
(سيتف (، أ ب) (، ب (+ أ ب)))))

؛؛ سيئ (وغير مفضل)
(تعريف الأكاذيب [أ ب]
(احيانا صحيح
(العائد أ)
(def (، أ ب) (، ب (+ أ ب)))))

· لا تستخدم بناء جملة s-expression حيث يكون المقصود هو بناء الجملة المتجه. على سبيل المثال، الحقيقة
أن أول هذين المثالين يعمل فقط لأن المترجم ليس مفرطًا
حازم. في الواقع، بناء الجملة الصحيح في أماكن مثل هذه هو الأخير.

؛؛ سيئة (وشر)
(ديفن فو (س) (طباعة س))
(فو 1)

؛؛ جيد (والمفضل)
(ديفن فو [x] (طباعة x))
(فو 1)

· استخدم ماكرو الترابط أو وحدات ماكرو ذيل الترابط عند مواجهة التداخل العميق
تعبيرات s. ومع ذلك، كن حكيما عند استخدامها. هل استخدامها عند الوضوح و
تحسين إمكانية القراءة؛ لا تقم بإنشاء تعبيرات معقدة يصعب فهمها.

؛؛ يفضل
(تعريف * الأسماء *
(مع [f (افتح "names.txt")]
(-> (.read f) (.strip) (.replace "\"" "") (.split ""،) (مرتبة))))

؛؛ ليس جيدا جدا
(تعريف * الأسماء *
(مع [f (افتح "names.txt")]
(مرتبة (.split ""، (.replace "\"" "" (.strip (.read f))))))))

؛؛ ربما لا يكون فكرة جيدة
(مربع الدفاع؟ [x]
(->> 2 (أسرى (int (sqrt x)))) (= x)))

· يُفضل استخدام التدوين النقطي بأسلوب Clojure بدلاً من الاستدعاء المباشر لطريقة الكائن،
على الرغم من أن كلاهما سيستمر في الدعم.

؛؛ جيد
(مع [fd (مفتوح "/ الخ / باسود")]
(طباعة (.readlines fd)))

؛؛ ليس جيدا جدا
(مع [fd (مفتوح "/ الخ / باسود")]
(طباعة (fd.readlines)))

وفي الختام
"الموضات تتلاشى، والأسلوب هو الأبدي" - إيف سان لوران

هذا الدليل هو مجرد مجموعة من إرشادات المجتمع، ومن الواضح أن إرشادات المجتمع تفعل ذلك
لا معنى له دون مجتمع نشط. المساهمات هي موضع ترحيب. انضم إلينا في #hy in
freenode، قم بالتدوين حول هذا الموضوع، قم بالتغريد عنه، والأهم من ذلك، استمتع بوقتك مع Hy.

شكر
· هذا الدليل مستوحى بشكل كبير من @بولتاغ مشاركة المدونة Hy بقاء دليل

· ال كلوجر الطراز دليل

وثائق INDEX


المحتويات:

أمر خط السطح البيني
hy
أمر خط مزيد من الخيارات
-c
قم بتنفيذ كود Hy في أمر.

$ hy -c "(طباعة (+ 2 2))"
4

-i
قم بتنفيذ كود Hy في أمر، ثم ابق في REPL.

-m
قم بتنفيذ كود Hy في وحدة، بما فيها معرف com لهذا التطبيق هو com.defmain إذا تم تعريفها.

-m تنهي العلامة قائمة الخيارات بحيث تكون جميع الوسائط بعد وحدة الاسم
يتم تمريرها إلى الوحدة النمطية في sys.argv.

الجديد في الإصدار 0.10.2

--جاسوس اطبع كود بايثون المكافئ قبل التنفيذ. على سبيل المثال:

=> (defn salutationsnm [name] (طباعة (+ "Hy " name "!"))))
التحية بالتأكيد (الاسم):
إرجاع الطباعة (((u'Hy ' + name) + u'!'))
=> (تحية "اسمك")
التحية (u'اسمك')
هاي اسمك!
=>

الجديد في الإصدار 0.9.11

--إظهار الآثار
طباعة تتبعات ممتدة لاستثناءات Hy.

الجديد في الإصدار 0.9.12

-v اطبع رقم إصدار Hy واخرج.

HYC
أمر خط مزيد من الخيارات
ملف[، ملف ن]
ترجمة كود Hy إلى Python bytecode. على سبيل المثال، قم بحفظ التعليمات البرمجية التالية باسم
hyname.hy:

(ديفن هاي هاي [الاسم]
(طباعة (+ "Hy "اسم"!")))

(هي هي "أفرومان")

ثم اركض:

$ hyc hyname.hy
$ بيثون hyname.pyc
هاي عفرومان!

hy2py
الجديد في الإصدار 0.10.1

أمر خط مزيد من الخيارات
-s

--مع المصدر
إظهار بنية المصدر التي تم تحليلها.

-a

--مع أست
إظهار AST الذي تم إنشاؤه.

-مثل

--بدون بيثون
لا تظهر رمز بايثون الذي تم إنشاؤه من AST.

Hy (لل لغة)
تحذير:
هذا غير مكتمل. يرجى النظر في المساهمة في جهود التوثيق.

شهادة ذكاء الأعمال of Hy
تحافظ Hy، فوق كل شيء آخر، على التوافق بنسبة 100% في كلا الاتجاهين مع Python
بحد ذاتها. تتبع جميع أكواد Hy بعض القواعد البسيطة. احفظ هذا لأنه سيأتي
مفيد.

تساعد هذه القواعد على التأكد من أن كود Hy اصطلاحي وقابل للتفاعل في كلتا اللغتين.

· سيتم ترجمة الرموز الموجودة في أغطية الأذن إلى النسخة ذات الأحرف الكبيرة من تلك السلسلة. ل
مثال، فو ستصبح فو.

· سيتم ترميز كيانات UTF-8 باستخدام Punycode والمسبقة ب هي_. على سبيل المثال،
ستصبح hy_w7h, ستصبح hy_g6hو أنا ♥ ش ستصبح hy_iu_t0x.

· الرموز التي تحتوي على شرطات سيتم استبدالها بشرطات سفلية. على سبيل المثال،
تقديم القالب ستصبح قالب تقديم. وهذا يعني أن الرموز ذات الشرطات سوف
قم بتظليل مرادفات الشرطة السفلية، والعكس صحيح.

بنيت الإضافية
يتميز Hy بعدد من النماذج الخاصة التي يتم استخدامها للمساعدة في إنشاء Python AST الصحيح.
فيما يلي النماذج "الخاصة"، التي قد يكون لها سلوك غير متوقع إلى حدٍ ما
بعض المواقف.

.
الجديد في الإصدار 0.10.0

. يتم استخدامه لتنفيذ الوصول إلى السمات على الكائنات. ويستخدم DSL صغير للسماح بسرعة
الوصول إلى السمات والعناصر في بنية البيانات المتداخلة.

على سبيل المثال،

(.فو بار باز [(+1 2)] فروب)

يجمع وصولا إلى:

foo.bar.baz[1+2].frob

. يجمع الوسيطة الأولى (في المثال، فو) باعتباره الكائن الذي سيتم تنفيذ الأمر عليه
عدم مرجعية السمة. ويستخدم الرموز العارية كسمات للوصول (في المثال، شريط,
الباز, فروب)، ويجمع محتويات القوائم (في المثال، [(+ 1 2)]) للفهرسة.
تؤدي الوسائط الأخرى إلى حدوث خطأ في الترجمة.

الوصول إلى سمات غير معروفة يلقي خطأ في السمة. الوصول إلى مفاتيح غير معروفة يلقي
خطأ الفهرس (في القوائم والصفوف) أو أ خطأ رئيسي (في القواميس).

->
-> (أو خيوط الماكرو) يستخدم لتجنب تداخل التعبيرات. ماكرو الترابط
إدراج كل تعبير في مكان الوسيطة الأولى للتعبير التالي. الأتى
يوضح الكود هذا:

=> (إخراج Defn [أ ب] (اطبع أ ب))
=> (-> (+ 4 6) (الإخراج 5))
10 5

- >>
- >> (أو خيوط ذيل الماكرو) يشبه خيوط الماكرو، ولكن بدلاً من
إدراج كل تعبير في الوسيطة الأولى للتعبير التالي، فإنه يقوم بإلحاقه باسم
الحجة الأخيرة. يوضح الكود التالي هذا:

=> (إخراج Defn [أ ب] (اطبع أ ب))
=> (->> (+ 4 6) (الإخراج 5))
5 10

تطبيق
تطبيق يتم استخدامه لتطبيق قائمة اختيارية من الوسائط وقاموسًا اختياريًا لـ kwargs
إلى وظيفة.

الاستخدام: (تطبيق اسم fn [أرغس] [كوارج])

أمثلة:

(ديفن ثونك []
"مرحبا هناك")

(تطبيق ثانك)
;=> "مرحبا"

(تعريف إجمالي الشراء [مبلغ السعر واختياري [الرسوم 1.05] [ضريبة القيمة المضافة 1.1]]
(* السعر مبلغ رسوم ضريبة القيمة المضافة))

(تطبيق إجمالي الشراء [10 15])
;=> 173.25

(تطبيق إجمالي الشراء [10 15] {"ضريبة القيمة المضافة" 1.05})
;=> 165.375

(تطبيق إجمالي الشراء [] {"السعر" 10 "المبلغ" 15 "ضريبة القيمة المضافة" 1.05})
;=> 165.375

و
و يستخدم في التعبيرات المنطقية يستغرق معلمتين على الأقل. إذا كانت جميع المعلمات
تقييم ل صواب، يتم إرجاع المعلمة الأخيرة. وفي أي حالة أخرى، فإن القيمة الخاطئة الأولى
سيتم إرجاع. مثال على الاستخدام:

=> (وصحيح خطأ)
خطأ

=> (وصحيح صحيح)
صواب

=> (وصحيح 1)
1

=> (وصحيح [] خطأ صحيح)
[]

NOTE:
و دوائر قصيرة ويتوقف عن تقييم المعلمات بمجرد ظهور الخطأ الأول
واجهت.

=> (وخطأ (اطبع "مرحبًا"))
خطأ

يجزم
يجزم يستخدم للتحقق من الشروط أثناء تشغيل البرنامج. إذا لم يكن الشرط
التقى، ان خطأ التأكيد تربى. يجزم قد يستغرق واحد أو اثنين من المعلمات. الأول
المعلمة هي الشرط المطلوب التحقق منه، ويجب تقييمها لأي منهما صواب or خطأ.
المعلمة الثانية، اختيارية، هي تسمية للتأكيد، وهي السلسلة التي ستكون
مرفوع مع خطأ التأكيد. على سبيل المثال:

(تأكيد (= متغير القيمة المتوقعة))

(تأكيد خطأ)
; خطأ التأكيد

(أكد (= 1 2) "واحد يجب أن يساوي اثنين")
; خطأ التأكيد: واحد يجب أن يساوي اثنين

مساعد
مساعد يتم استخدامه لربط مفتاح بقيمة في القاموس أو لتعيين فهرس لقائمة
إلى قيمة. يستغرق الأمر ثلاث معلمات على الأقل: البيانات بناء ليتم تعديلها، أ مفتاح
or مؤشر، و قيمنا. إذا تم استخدام أكثر من ثلاث معلمات، فسيتم ربطها في أزواج.

أمثلة على الاستخدام:

=>(دع [[مجموعة {}]]
... (مجموعة مساعد "الكلب" "النباح")
... (مجموعة الطباعة))
{u'الكلب': u'النباح'}

=>(دع [[مجموعة {}]]
... (مجموعة مساعد "الكلب" "النباح" "القط" "مواء")
... (مجموعة الطباعة))
{u'Cat': u'Meow'، u'Dog': u'Bark'}

=>(دع [[مجموعة [1 2 3 4]]]
... (المجموعة المساعدة 2 لا شيء)
... (مجموعة الطباعة))
[1، 2، لا شيء، 4]

NOTE:
مساعد يعدل بنية البيانات في مكانها ويعيدها بدون اضاءة.

استراحة
استراحة يستخدم للخروج من الحلقة. ينهي الحلقة على الفور. الأتى
المثال لديه لا نهاية لها في حين الحلقة التي يتم إنهاؤها بمجرد دخول المستخدم k.

(بينما صحيح (إذا (= "k" (الإدخال الأولي "؟""))
(استراحة)
(اطبع "حاول مرة أخرى")))

كوند
كوند يمكن استخدامها لبناء متداخلة if صياغات. يوضح المثال التالي
العلاقة بين الماكرو وتوسعه:

(الشرط [الحالة-1 النتيجة-1]
[الحالة-2 النتيجة-2])

(إذا كان الشرط-1 النتيجة-1
(إذا كان الشرط-2 النتيجة-2))

كما هو موضح أدناه، يتم تنفيذ كتلة النتائج المطابقة الأولى فقط.

=> (قيمة التحقق من Defn [القيمة]
... (الشرط [(< القيمة 5) (طباعة "القيمة أصغر من 5")]
... [(= القيمة 5) (اطبع "القيمة تساوي 5")]
... [(> القيمة 5) (طباعة "القيمة أكبر من 5")]
... [صحيح (اطبع "القيمة شيء لا ينبغي أن يكون")]))

=> (قيمة الاختيار 6)
القيمة أكبر من 5

استمر
استمر إرجاع التنفيذ إلى بداية الحلقة. في المثال التالي،
(الآثار الجانبية 1) يتم استدعاؤه لكل تكرار. (الآثار الجانبية 2)ومع ذلك، يتم استدعاؤه فقط
كل قيمة أخرى في القائمة.

؛؛ بافتراض أن (التأثير الجانبي 1) و (التأثير الجانبي 2) هما وظائف و
؛؛ المجموعة هي قائمة من القيم العددية

(لـ [مجموعة x]

(تأثير جانبي 1 ×)
(إذا (٪ × 2)
(يكمل))
(الآثار الجانبية 2 ×)))

dict-comp
dict-comp يستخدم لإنشاء القواميس. يستغرق ثلاثة أو أربعة معلمات. الأول
هناك معلمتان مخصصتان للتحكم في قيمة الإرجاع (زوج القيمة الرئيسية) بينما المعلمة الثالثة هي
تستخدم لتحديد العناصر من تسلسل. يمكن استخدام المعلمة الرابعة والاختيارية
تصفية بعض العناصر في التسلسل بناءً على تعبير شرطي.

=> (dict-comp x (* x 2) [x (النطاق 10)] (فردي؟ x))
{1: 2، 3: 6، 9: 18، 5: 10، 7: 14}

do / com.prog
do و com.prog يتم استخدامها لتقييم كل وسيطة وإرجاع الوسيطة الأخيرة. يعود
يتم تجاهل القيم من كل وسيطة أخرى غير الوسيطة الأخيرة. يمكن استخدامه في لامدا or
قائمة شركات لتنفيذ منطق أكثر تعقيدًا كما هو موضح في أحد الأمثلة التالية.

بعض الأمثلة على الاستخدام:

=> (إذا كان صحيحا
... (افعل (اطبع "موسيقى الروك للآثار الجانبية!")
... (اطبع "نعم، حقًا!")))
آثار جانبية صخرة!
نعم حقا!

؛؛ بافتراض أن (التأثير الجانبي) هي وظيفة نريد الاتصال بها لكل منها
؛؛ وكل قيمة في القائمة ولكن لا نهتم بقيمتها المرتجعة
=> (list-comp (do (التأثير الجانبي x)
... (إذا (< × 5) (* 2 ×)
... (* 4 ×)))
... (س (النطاق 10)))
[0، 2، 4، 6، 8، 20، 24، 28، 32، 36]

do يمكنه قبول أي عدد من الوسائط، من 1 إلى n.

صفر / setv
صفر و setv تُستخدم لربط قيمة أو كائن أو وظيفة برمز. على سبيل المثال:

=> (أسماء التعريف ["Alice" "Bob" "Charlie"])
=> (أسماء الطباعة)
[u'Alice'، u'Bob'، u'Charlie']

=> (عداد setv (fn [عنصر المجموعة] (عنصر المجموعة .count)))
=> (العداد [1 2 3 4 5 2 3] 2)
2

إلغاء التصنيف
يتم الإعلان عن فئات جديدة مع إلغاء التصنيف. يمكن أن يستغرق الأمر معلمتين اختياريتين: المتجه
تحديد الفئات الفائقة المحتملة وناقل آخر يحتوي على سمات الجديد
فئة كمتجهين للعنصر.

(اسم فئة إلغاء التصنيف [super-class-1 super-class-2]
[[قيمة السمة]])

يمكن ربط كل من القيم والوظائف بالفئة الجديدة كما هو موضح في المثال أدناه:

=> (إلغاء تصنيف القطة []
... [[العمر لا يوجد]
...[اللون "أبيض"]
... [تكلم (fn [self] (اطبع "Meow"))]])

=> (بقعة محددة (القط))
=> (موقع setv.color "أسود")
'أسود'
=> (مكان التحدث)
مواء

ديفين / com.defun
ديفين و com.defun يتم استخدام وحدات الماكرو لتحديد الوظائف. يأخذون ثلاث معلمات: الاسم
من وظيفة لتحديد، ناقلات المعلمات، و الجسدي من الوظيفة:

(اسم التعريف [params] الجسم)

قد تحتوي المعلمات على الكلمات الأساسية التالية أمامها:

&خياري
المعلمة اختيارية. يمكن إعطاء المعلمة كقائمة مكونة من عنصرين، حيث
العنصر الأول هو اسم المعلمة والثاني هو القيمة الافتراضية. المعلمة
يمكن أيضًا تقديمه كعنصر واحد، وفي هذه الحالة تكون القيمة الافتراضية بدون اضاءة.

=> (تعريف القيمة الإجمالية [القيمة &اختياري [ضريبة القيمة المضافة 10]]
... (+ (/ (* ضريبة القيمة المضافة) 100) القيمة))

=> (القيمة الإجمالية 100)
110.0

=> (القيمة الإجمالية 100 1)
101.0

&مفتاح

&kwargs
ستحتوي المعلمة على 0 أو أكثر من وسيطات الكلمات الرئيسية.

تحدد أمثلة التعليمات البرمجية التالية وظيفة ستقوم بطباعة جميع الكلمات الرئيسية
الحجج وقيمها.

=> (تعريف معلمات الطباعة [&kwargs kwargs]
... (لـ [(، k v) (.items kwargs)] (print k v)))

=> (تطبيق معلمات الطباعة [] {"parameter-1" 1 "parameter-2" 2})
المعلمة-2 2
المعلمة-1 1

&استراحة ستحتوي المعلمة على 0 وسيطات موضعية أو أكثر. لا موضعية أخرى
يمكن تحديد الوسائط بعد هذا.

يعرّف مثال التعليمات البرمجية التالي دالة يمكن إعطاؤها من 0 إلى n عدديًا
حدود. ثم يجمع كل رقم فردي ويطرح كل رقم زوجي.

=> (المجموع المتعرج [&الأرقام المتبقية]
(دع [[أرقام فردية (قائمة شركات x [أرقام x] (فردية؟ x))]
[الأعداد الزوجية (قائمة الشركات x [أرقام x] (زوجية؟ x))]]
((- (مجموع الأعداد الفردية) (مجموع الأعداد الزوجية))))

=> (مجموع متعرج)
0
=> (مجموع متعرج 3 9 4)
8
=> (مجموع متعرج 1 2 3 4 5 6)
-3

الاسم المستعار ديفن / defun-alias
الجديد في الإصدار 0.10.0

الاسم المستعار ديفن و defun-alias وحدات الماكرو تشبه إلى حد كبير ديفين، مع التمييز الذي
بدلاً من تعريف دالة باسم واحد، يمكنها أيضًا تعريف الأسماء المستعارة. آخر
من أخذ قائمة الرموز لأسماء الوظائف كمعلمة أولى، الاسم المستعار ديفن و
defun-alias لا تختلف عن ديفين و com.defun.

=> (defn-alias [الاسم المستعار للاسم الرئيسي] []
... (اطبع "مرحبًا!"))
=> (الاسم الرئيسي)
"مرحبًا!"
=> (الاسم المستعار)
"مرحبًا!"

معرف com لهذا التطبيق هو com.defmain
الجديد في الإصدار 0.10.1

معرف com لهذا التطبيق هو com.defmain يحدد الماكرو وظيفة رئيسية يتم استدعاؤها على الفور sys.argv as
الوسائط إذا وفقط إذا تم تنفيذ هذا الملف كبرنامج نصي. وبعبارة أخرى هذا:

(التعريف [&الوسائط المتبقية]
(افعل شيئًا باستخدام الحجج))

يعادل:

مواطنه الرئيسي(*الوسائط):
افعل_شيء_مع(الوسائط)
عودة 0

إذا __name__ == "__main__":
استيراد تميز الكلية
retval = الرئيسي(*sys.arg)

إذا كان مثيل (retval، int):
خروج النظام (إعادة)

لاحظ أنه كما ترون أعلاه، إذا قمت بإرجاع عدد صحيح من هذه الدالة، فسيكون ذلك
تستخدم كحالة الخروج للبرنامج النصي الخاص بك. (الإعدادات الافتراضية لـ Python للخروج من الحالة 0 وإلا،
مما يعني أن كل شيء على ما يرام!)

(منذ (sys.exit 0) لا يتم تشغيله بشكل صريح في حالة الإرجاع من غير عدد صحيح
معرف com لهذا التطبيق هو com.defmain، إنها فكرة جيدة أن تضعها (محدد) كآخر جزء من التعليمات البرمجية في ملفك.)

com.defmacro
com.defmacro يستخدم لتحديد وحدات الماكرو. الشكل العام هو (defmacro الاسم [العوامل]
اكسبر).

يحدد المثال التالي ماكرو يمكن استخدامه لتبديل ترتيب العناصر في التعليمات البرمجية،
السماح للمستخدم بكتابة التعليمات البرمجية في تدوين infix، حيث يكون المشغل بين
المعاملات.

=> (defmacro infix [رمز]
... (شبه الاقتباس (
... (إلغاء الاقتباس (احصل على الرمز 1))
... (إلغاء الاقتباس (احصل على الرمز 0))
... (إلغاء الاقتباس (احصل على الرمز 2)))))

=> (التثبيت (1 + 1))
2

الاسم المستعار defmacro
الاسم المستعار defmacro يستخدم لتعريف وحدات الماكرو بأسماء متعددة (الأسماء المستعارة). الشكل العام
is (defmacro الاسم المستعار [أسماء] [العوامل] اكسبر). يقوم بإنشاء وحدات ماكرو متعددة بنفس الطريقة
قائمة المعلمات والنص، ضمن قائمة الأسماء المحددة.

يحدد المثال التالي وحدتي ماكرو، وكلاهما يسمح للمستخدم بكتابة التعليمات البرمجية
تدوين infix.

=> (اسم مستعار defmacro [infix infi] [رمز]
... (شبه الاقتباس (
... (إلغاء الاقتباس (احصل على الرمز 1))
... (إلغاء الاقتباس (احصل على الرمز 0))
... (إلغاء الاقتباس (احصل على الرمز 2)))))

=> (التثبيت (1 + 1))
2
=> (معلومات (1 + 1))
2

ديماكرو/ز!
الجديد في الإصدار 0.9.12

ديماكرو/ز! هي نسخة خاصة من com.defmacro الذي يتم استخدامه للإنشاء تلقائيًا com.gensym
لأي رمز يبدأ بـ g!.

على سبيل المثال، ز!أ قد يصبح (جينسيم "أ").

رؤية أيضا:
القسم باستخدام-gensym

مزيل الخوف
الجديد في الإصدار 0.9.12

مزيل الخوف يحدد ماكرو القارئ، مما يتيح لك إعادة هيكلة أو تعديل بناء الجملة.

=> (أداة إزالة القراءة ^ [expr] (طباعة expr))
=> #^(1 2 3 4)
(1 2 3 4)
=> #^"مرحبا"
"مرحبا"

رؤية أيضا:
وحدات الماكرو لقارئ القسم

من
الجديد في الإصدار 0.9.12

من إزالة كائن من مساحة الاسم الحالية.

=> (سيتف فو 42)
=> (ديل فو)
=> فو
تتبع (آخر مكالمة أخيرة):
الملف ""، السطر 1، في
خطأ في الاسم: لم يتم تعريف الاسم "foo".

من يمكنه أيضًا إزالة الكائنات من التعيينات والقوائم والمزيد.

=> (اختبار setv (القائمة (النطاق 10)))
=> اختبار
[0، 1، 2، 3، 4، 5، 6، 7، 8، 9]
=> (ديل (اختبار الشريحة 2 4)) ;; إزالة العناصر من 2 إلى 4 مستبعدة
=> اختبار
[0، 1، 4، 5، 6، 7، 8، 9]
=> (setv dic {"foo" "bar"})
=> دي
{"فو": "شريط"}
=> (ديل (احصل على dic "foo"))
=> دي
{}

القيام به ل
الجديد في الإصدار 0.10.1

القيام به ل يتم استخدامه لتبسيط سلسلة من استدعاءات الأسلوب لكائن ما.

=> (دوتو [] (.الملحق 1) (.الملحق 2) .عكسي)
[2 1]

=> (مجموعة سي تي في [])
=> (.إلحاق المجموعة 1)
=> (.إلحاق المجموعة 2)
=> (المجموعة العكسية)
=> جمع
[2 1]

وحدة التقييم
وحدة التقييم تقييم تعبير مقتبس وإرجاع القيمة.

=> (التقييم '(اطبع "Hello World"))
"مرحبا بالعالم"

تقييم وتجميع
تقييم عند الترجمة
أول / سيارة
أول و سيارة هي وحدات ماكرو للوصول إلى العنصر الأول من المجموعة:

=> (الأول (النطاق 10))
0

For
For يتم استخدامه لاستدعاء دالة لكل عنصر في القائمة أو المتجه. نتائج كل
يتم تجاهل المكالمة و For يعود التعبير بدون اضاءة بدلاً من. يتكرر رمز المثال
على مدى مجموعة شتاء XNUMX ولكل منهما العنصر in مجموعة شتاء XNUMX يدعو اعراض جانبية تعمل مع
العنصر كحجتها:

؛؛ بافتراض أن (التأثير الجانبي) هي دالة تأخذ معلمة واحدة
(لـ [مجموعة العناصر] (عنصر التأثير الجانبي))

؛؛ for يمكن أن تحتوي على كتلة اختيارية else
(لـ [مجموعة العناصر] (عنصر التأثير الجانبي)
(آخر (الأثر الجانبي -2)))

اختياري آخر يتم تنفيذ الكتلة فقط إذا كان For تنتهي الحلقة بشكل طبيعي. إذا
تم إيقاف التنفيذ مع استراحةأطلقت حملة آخر لا يتم تنفيذ الكتلة.

=> (لـ [العنصر [1 2 3]] (إذا (< العنصر 3)
... (عنصر الطباعة)
... (استراحة))
... (آخر (طباعة "انتهت الحلقة")))
1
2

=> (لـ [العنصر [1 2 3]] (إذا (< العنصر 4)
... (عنصر الطباعة)
... (استراحة))
... (آخر (طباعة "انتهت الحلقة")))
1
2
3
انتهت الحلقة

com.genexpr
com.genexpr يستخدم لإنشاء تعبيرات المولد. يستغرق اثنين أو ثلاثة المعلمات. ال
المعلمة الأولى هي التعبير الذي يتحكم في قيمة الإرجاع، بينما يتم استخدام المعلمة الثانية
لتحديد عناصر من القائمة. يمكن استخدام المعلمة الثالثة والاختيارية للتصفية
بعض العناصر الموجودة في القائمة بناءً على تعبير شرطي. com.genexpr يشبه
قائمة شركات، إلا أنه يُرجع عنصرًا تكراريًا يُقيِّم القيم واحدًا تلو الآخر بدلاً من ذلك
تقييمهم على الفور.

=> (مجموعة التعريف (النطاق 10))
=> (تم تصفيته (def التصفية (genexpr x [x Collection] (حتى؟ x)))
=> (قائمة تمت تصفيتها)
[0 ، 2 ، 4 ، 6 ، 8]

com.gensym
الجديد في الإصدار 0.9.12

com.gensym يُستخدم لإنشاء رمز فريد يسمح بكتابة وحدات الماكرو بدونها
اشتباكات اسم المتغير العرضي.

=> (جنسيم)
ش':G_1235'

=> (جينسيم "x")
ش':x_1236'

رؤية أيضا:
القسم باستخدام-gensym

دولار فقط واحصل على خصم XNUMX% على جميع
دولار فقط واحصل على خصم XNUMX% على جميع يستخدم للوصول إلى العناصر الفردية في القوائم والقواميس. دولار فقط واحصل على خصم XNUMX% على جميع يأخذ معلمتين:
ال البيانات بناء و مؤشر or مفتاح من هذا البند. ثم سيتم إرجاع المقابلة
القيمة من القاموس أو القائمة. مثال على الاستخدام:

=> (دع [[الحيوانات {"كلب" "ينبح" "قطة" "مواء"}]
... [الأرقام ["صفر" "واحد" ""اثنان"""ثلاثة"]]]
... (اطبع (احصل على حيوانات "كلب"))
... (اطبع (احصل على الأرقام 2)))
لحاء
اثنان

NOTE:
دولار فقط واحصل على خصم XNUMX% على جميع يُطلق خطأ KeyError إذا تم الاستعلام عن قاموس لمفتاح غير موجود.

NOTE:
دولار فقط واحصل على خصم XNUMX% على جميع يُطلق خطأ IndexError إذا تم الاستعلام عن قائمة أو صف لفهرس خارج
الحدود.

شامل
شامل يمكن استخدامها لوضع علامة على الرمز على أنه عالمي. وهذا يسمح للمبرمج بتعيين
القيمة إلى رمز عالمي. قراءة رمز عالمي لا يتطلب شامل الكلمة الرئيسية --
فقط التعيين يفعل.

يوضح المثال التالي كيفية استخدام الرمز العالمي a يتم تعيين قيمة في وظيفة و
تتم طباعته لاحقًا في وظيفة أخرى. بدون ال شامل الكلمة الأساسية، الوظيفة الثانية
كان سيلقي أ الاسم خطأ.

(تعريف مجموعة [القيمة]
(العالمي أ)
(قيمة setv))

(تعريف الطباعة-أ []
(طباعة أ))

(المجموعة أ 5)
(طباعة-أ)

if / ان لم
الجديد في الإصدار 0.10.0: إذا لم يكن كذلك

if يتم استخدامه لتحديد التعليمات البرمجية بشكل مشروط ليتم تنفيذها. يجب أن تحتوي على شرط
block والكتلة التي سيتم تنفيذها إذا تم تقييم كتلة الشرط لها صواب. اختياريا ،
وقد تحتوي على كتلة نهائية يتم تنفيذها في حالة تقييم الحالة
خطأ.

ان لم مشابه، ولكن سيتم تنفيذ الكتلة الثانية عندما يفشل الشرط
يتم تنفيذ الكتلة الثالثة والأخيرة عندما ينجح الاختبار - بالترتيب المعاكس if.

استخدام المثال:

(إذا (المال المتبقي؟ الحساب)
(اطبع "هيا بنا نذهب للتسوق")
(اطبع "دعونا نذهب ونعمل"))

(إن لم يكن (المال المتبقي؟ الحساب)
(اطبع "دعونا نذهب ونعمل")
(طباعة "دعونا نذهب للتسوق"))

يتم احترام صدق بايثون. بدون اضاءة, خطأ، صفر من أي نوع رقمي، تسلسل فارغ،
ويعتبر قاموس فارغ خطأ; كل شيء آخر يعتبر صواب.

اللثغة إذا / ليف و اللثغة إذا لم يكن كذلك / الحياة لا
الجديد في الإصدار 0.10.0

الجديد في الإصدار 0.10.2: lisp-if-not / lif-not

بالنسبة لأولئك الذين يفضلون المزيد من Lispy if الشرط، لدينا اللثغة إذاالطرق أو ليف. هذا فقط وتعتبر
بدون اضاءة / صفر ليكون كاذبا! جميع قيم بايثون "الخاطئة" الأخرى تعتبر صحيحة.
على العكس من ذلك، لدينا اللثغة إذا لم يكن كذلك و الحياة لا بالتوازي مع if و ان لم الذي ينعكس
المقارنة.

=> (ليسب-إذا كان صحيحا "صحيح" "خطأ")
"صحيح"
=> (ليسب-إذا كان خطأ "صحيح" "خطأ")
"صحيح"
=> (ليسب-إذا 0 "صحيح" "خطأ")
"صحيح"
=> (ليسب-إذا كان لا شيء "صحيح" "خطأ")
"خطأ شنيع"
=> (ليسب-إذا لم يكن هناك "صحيح" "خطأ")
"خطأ شنيع"
=> (ليسب-إذا-لا شيء "صحيح" "خطأ")
"صحيح"
=> (ليسب-إذا-ليس لا شيء "صحيح" "خطأ")
"صحيح"
=> (ليسب-إذا-ليس خطأ "صحيح" "خطأ")
"خطأ شنيع"

; أي ما يعادلها ولكن أقصر
=> (ليف صحيح "صحيح" "خطأ")
"صحيح"
=> (ليف نيل "صحيح" "خطأ")
"خطأ شنيع"
=> (ليف-ليس لا شيء "صحيح" "خطأ")
"صحيح"

استيراد
استيراد يستخدم لاستيراد الوحدات، كما هو الحال في بايثون. هناك عدة طرق لذلك استيراد يمكن
يستخدم.

؛؛ يستورد كل من هذه الوحدات
;;
؛؛ بايثون:
؛؛ نظام الاستيراد
؛؛ استيراد نظام التشغيل.path
(استيراد sys os.path)

؛؛ الاستيراد من الوحدة النمطية
;;
؛؛ بايثون: من os.path يوجد استيراد، isdir، isfile
(استيراد [os.path [يوجد isdir isfile]])

؛؛ استيراد باستخدام اسم مستعار
;;
؛؛ بايثون: استيراد sys كـ systest
(استيراد [sys: as systest])

؛؛ يمكنك إدراج أي عدد تريده من الواردات من أنواع مختلفة.
(استيراد [tests.resources [kwtest function-with-a-dash]]
[os.path [يوجد ملف isdir]]
[نظام : كنظام])

؛؛ استيراد جميع وظائف الوحدة النمطية إلى مساحة الاسم الحالية
(استيراد [سيسي [*]])

لامدا / fn
لامدا و fn يمكن استخدامها لتحديد وظيفة مجهولة. المعلمات متشابهة
ديفين: المعلمة الأولى هي ناقل المعلمات والباقي هو نص الملف
وظيفة. لامدا إرجاع وظيفة جديدة. في المثال التالي، دالة مجهولة
يتم تعريفها وتمريرها إلى وظيفة أخرى لتصفية الإخراج.

=> (def الأشخاص [{:name "Alice" :العمر 20}
... {: الاسم "بوب" :العمر 25}
... {: الاسم "تشارلي" :العمر 50}
... {: الاسم "ديف" :العمر 5}])

=> (تعريف عرض الأشخاص [مرشح الأشخاص]
... (لـ [الشخص الأشخاص] (إذا (مرشح الشخص) (اطبع (:اسم الشخص))))))

=> (عرض-الأشخاص (fn [شخص] (< (:الشخص العمري) 25)))
أليس
ديف

تمامًا كما هو الحال في تعريفات الوظائف العادية، إذا كان العنصر الأول في الجسم عبارة عن سلسلة، فإنه
بمثابة سلسلة وثائقية. وهذا مفيد لإعطاء مستندات أساليب الفصل.

=> (setv مرات-ثلاثة
... (الجبهة الوطنية [x]
... "ضرب المدخلات بثلاثة وإرجاع النتيجة."
... (*×3)))

يمكن تأكيد ذلك عبر Python المدمج مساعدة وظيفة:

=> (مساعدة مرات-ثلاثة)
مساعدة في الدالة times_three:

times_three(x)
ضرب المدخلات بثلاثة وإرجاع النتيجة
(النهاية)

آخر
الجديد في الإصدار 0.10.2

آخر يمكن استخدامها للوصول إلى العنصر الأخير في المجموعة:

=> (الأخير [2 4 6])
6

اسمحوا
اسمحوا يتم استخدامه لإنشاء متغيرات ذات نطاق معجمي. يتم إنشاؤها في بداية
اسمحوا الشكل وينتهي من الوجود بعد الشكل. المثال التالي يوضح هذا
سلوك:

=> (دع [[x 5]] (اطبع x)
... (دع [[x 6]] (اطبع x))
... (اطبع س))
5
6
5

اسمحوا يأخذ الماكرو معلمتين: تعريف المتجه المتغيرات و الجسدي الذي يحصل
أعدم. المتغيرات هو متجه حيث يكون كل عنصر إما متغيرًا واحدًا أو متجهًا
تحديد زوج القيمة المتغيرة. وفي حالة وجود متغير واحد، يتم تعيين قيمة له
بدون اضاءة; وبخلاف ذلك، يتم استخدام القيمة المقدمة.

=> (دع [x [y 5]] (اطبع x y))
لا شيء 5

قائمة شركات
قائمة شركات ينفذ قائمة الفهم. يستغرق اثنين أو ثلاثة المعلمات. الأول
المعلمة هي التعبير الذي يتحكم في قيمة الإرجاع، بينما يتم استخدام الثانية
حدد العناصر من القائمة. يمكن استخدام المعلمة الثالثة والاختيارية لتصفية البعض
للعناصر الموجودة في القائمة بناءً على تعبير شرطي. بعض الأمثلة:

=> (مجموعة التعريف (النطاق 10))
=> (قائمة شركات x [مجموعة x])
[0، 1، 2، 3، 4، 5، 6، 7، 8، 9]

=> (قائمة شركات (* x 2) [مجموعة x])
[0، 2، 4، 6، 8، 10، 12، 14، 16، 18]

=> (قائمة الشركات (* x 2) [مجموعة x] (< x 5))
[0 ، 2 ، 4 ، 6 ، 8]

ليس
ليس يستخدم في التعبيرات المنطقية يستغرق معلمة واحدة ويعيد عكسها
القيمة الحقيقة. لو صواب يتم إعطاء كمعلمة ، خطأ سيتم إرجاعها، والعكس صحيح.
استخدام المثال:

=> (غير صحيح)
خطأ

=> (ليس خطأ)
صواب

=> (ليس لا شيء)
صواب

or
or يستخدم في التعبيرات المنطقية يستغرق معلمتين على الأقل. وسوف يعود
المعلمة الأولى غير كاذبة. إذا لم تكن هذه القيمة موجودة، فسيتم إرجاع المعلمة الأخيرة.

=> (أو صحيح خطأ)
صواب

=> (وكاذبة كاذبة)
خطأ

=> (وخطأ 1 صحيح خطأ)
1

NOTE:
or دوائر قصيرة ويتوقف عن تقييم المعلمات بمجرد ظهور القيمة الحقيقية الأولى
واجهت.

=> (أو صحيح (اطبع "مرحبًا"))
صواب

طباعة
طباعة يستخدم للإخراج على الشاشة. مثال على الاستخدام:

(اطبع "مرحبًا بالعالم!")

NOTE:
طباعة يعود دائما بدون اضاءة.

شبه الاقتباس
شبه الاقتباس يسمح لك باقتباس نموذج، ولكن أيضًا بتقييم التعبيرات بشكل انتقائي.
التعبيرات داخل أ شبه الاقتباس يمكن تقييمها بشكل انتقائي باستخدام ختم كلاما مقتبسا بعلامة (~). ال
يمكن أيضًا ربط النموذج المُقيَّم باستخدام لصق غير الاقتباس (~@). يمكن أن يكون شبه الاقتباس أيضًا
مكتوبة باستخدام الاقتباس الخلفي (`) رمز.

؛؛ دع `qux' يكون متغيرًا ذو قيمة (bar baz)
``(فو ~qux)
; يعادل '(فو (بار باز))
`(فو ~@qux)
; يعادل '(فو بار باز)

اقتبس
اقتبس إرجاع النموذج الذي تم تمريره إليه دون تقييمه. اقتبس يمكن أن يكون بدلا من ذلك
مكتوبة باستخدام الفاصلة العليا (') رمز.

=> (setv x '(اطبع "Hello World"))
; تم تعيين المتغير x على التعبير ولم يتم تقييمه
=> س
(u'print' u'Hello World')
=> (قيمة س)
مرحبا يا عالم

تطلب
تطلب يستخدم لاستيراد وحدات الماكرو من وحدة معينة. يستغرق معلمة واحدة على الأقل
تحديد الوحدة التي يجب استيراد وحدات الماكرو. يمكن استيراد وحدات متعددة
مع واحد تطلب.

سيقوم المثال التالي باستيراد وحدات الماكرو من وحدة 1 و وحدة 2:

(تتطلب الوحدة 1 الوحدة 2)

بقية / مجلس الإنماء والإعمار
بقية و مجلس الإنماء والإعمار إرجاع المجموعة التي تم تمريرها كوسيطة بدون العنصر الأول:

=> (الراحة (النطاق 10))
[1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9]

مجموعة شركات
مجموعة شركات يستخدم لإنشاء مجموعات. يستغرق اثنين أو ثلاثة المعلمات. المعلمة الأولى هي
للتحكم في قيمة الإرجاع، بينما يتم استخدام الثاني لتحديد العناصر من أ
تسلسل. يمكن استخدام المعلمة الثالثة والاختيارية لتصفية بعض العناصر الموجودة
التسلسل بناءً على تعبير شرطي.

=> (بيانات الجهاز [1 2 3 4 5 2 3 4 5 3 4 5])
=> (مجموعة شركات x [بيانات x] (فردي؟ x))
{1 و 3 و 5}

شريحة
شريحة يمكن استخدامها لأخذ مجموعة فرعية من القائمة وإنشاء قائمة جديدة منها. الاستمارة
يأخذ معلمة واحدة على الأقل تحدد القائمة المراد تقسيمها. يمكن أن يكون هناك معلمتين اختياريتين
تستخدم لتحديد موضع البداية والنهاية للمجموعة الفرعية. إذا لم يتم توفيرها،
القيمة الافتراضية لـ بدون اضاءة سيتم استخدامها بدلا من ذلك. يتم استخدام المعلمة الاختيارية الثالثة ل
خطوة التحكم بين العناصر.

شريحة يتبع نفس القواعد مثل نظيره بايثون. يتم احتساب المؤشرات السلبية
ابتداء من نهاية القائمة. بعض الأمثلة على الاستخدام:

=> (مجموعة التعريف (النطاق 10))

=> (مجموعة الشرائح)
[0، 1، 2، 3، 4، 5، 6، 7، 8، 9]

=> (مجموعة الشرائح 5)
[5 ، 6 ، 7 ، 8 ، 9]

=> (مجموعة الشرائح 2 8)
[2 ، 3 ، 4 ، 5 ، 6 ، 7]

=> (مجموعة الشرائح 2 8 2)
[2 و 4 و 6]

=> (مجموعة الشرائح -4 -2)
[6، 7]

رمي / رفع
رمي or رفع يمكن استخدام النماذج لرفع استثناء في وقت التشغيل. مثال على الاستخدام:

(يرمي)
; إعادة رايس الاستثناء الأخير

(رمي IOError)
; رمي خطأ IOE

(رمي (IOError "foobar"))
; رمي خطأ IOError("foobar")

رمي يمكنه قبول وسيطة واحدة (an استثناء فئة أو مثيل) أو لا توجد وسائط ل
إعادة رفع الأخير استثناء.

محاولة
محاولة يستخدم النموذج لبدء محاولة / قبض حاجز. يتم استخدام النموذج على النحو التالي:

(يحاول
(وظيفة معرضة للخطأ)
(التقط [e ZeroDivisionError] (اطبع "القسمة على صفر"))
(آخر (اطبع "لا توجد أخطاء"))
(أخيرًا (اطبع "تم كل شيء")))

محاولة يجب أن تحتوي على واحد على الأقل قبض كتلة، ويمكن أن تتضمن بشكل اختياري آخر or أخيرا
حاجز. إذا ظهر خطأ مع كتلة التقاط مطابقة أثناء تنفيذ
وظيفة معرضة للخطأ، أن قبض سيتم تنفيذ الكتلة. إذا لم يتم ظهور أي أخطاء، فإن آخر
يتم تنفيذ الكتلة. ال أخيرا سيتم تنفيذ الكتلة أخيرًا بغض النظر عما إذا كان الأمر كذلك أم لا
تم رفع الخطأ.

ما لم
ما لم الماكرو هو اختصار لكتابة ملف if بيان يتحقق مما إذا كان المعطى
مشروط هو خطأ. ويبين ما يلي توسيع هذا الماكرو.

(ما لم يكن البيان الشرطي)

(إذا كان مشروطا
بدون اضاءة
(افعل البيان))

ختم كلاما مقتبسا بعلامة
ضمن نموذج شبه مقتبس، ختم كلاما مقتبسا بعلامة قوات تقييم الرمز. ختم كلاما مقتبسا بعلامة هو مستعار ل
التلدة (~) رمز.

(اسم التعريف "الحضن")
(شبه الاقتباس (= اسم (اسم غير مقتبس)))
;=> (u'=' u'name' u'Cuddles')

`(= الاسم ~الاسم)
;=> (u'=' u'name' u'Cuddles')

لصق غير الاقتباس
لصق غير الاقتباس يفرض تقييم رمز ضمن نموذج شبه مقتبس، يشبه إلى حد كبير
ختم كلاما مقتبسا بعلامة. لصق غير الاقتباس لا يمكن استخدامه إلا عندما يحتوي الرمز غير المقتبس على
قيمة قابلة للتكرار، لأنها "تربط" تلك القابلة للتكرار في النموذج شبه المقتبس. لصق غير الاقتباس is
مستعار ل ~@ رمز.

(الأرقام التعريفية [1 2 3 4])
(شبه الاقتباس (+ (أرقام لصق غير الاقتباس)))
;=> (u'+' 1 لتر 2 لتر 3 لتر 4 لتر)

`(+ ~@ الأعداد)
;=> (u'+' 1 لتر 2 لتر 3 لتر 4 لتر)

متى
متى يشبه ما لم، إلا أنها تختبر عندما يكون الشرط المعطى صواب. ليس
من الممكن أن يكون آخر كتلة في أ متى دقيق. وفيما يلي يظهر التوسع في
دقيق.

(عند العبارة الشرطية)

(إذا كان مشروطًا (افعل البيان))

في حين
في حين يتم استخدامه لتنفيذ كتلة واحدة أو أكثر طالما تم استيفاء الشرط. الأتى
المثال سوف يخرج "مرحبا بالعالم!" على الشاشة إلى أجل غير مسمى:

(بينما صحيح (طباعة "مرحبا بالعالم!"))

مع
مع يتم استخدامه لتغليف تنفيذ كتلة داخل مدير السياق. السياق
يمكن للمدير بعد ذلك إعداد النظام المحلي وتدميره بطريقة يمكن التحكم فيها. ال
مثال نموذجي للاستخدام مع هو عند معالجة الملفات. مع يمكن ربط السياق بـ
حجة أو تجاهلها تماما، كما هو مبين أدناه:

(مع كتلة [[arg (expr)]])

(مع كتلة [[(expr)]])

(مع كتلة [[arg (expr)] [(expr)]])

المثال التالي سيفتح الملف أخبار ملف وطباعة محتواه على الشاشة. ال
يتم إغلاق الملف تلقائيًا بعد معالجته.

(مع [[f (افتح "NEWS")]] (اطبع (.read f)))

مع الديكور
مع الديكور يستخدم لالتفاف وظيفة مع أخرى. الوظيفة التي تؤدي
يجب أن تقبل الزخرفة قيمة واحدة: الوظيفة التي يتم تزيينها، وإرجاع قيمة جديدة
وظيفة. مع الديكور يأخذ ما لا يقل عن معلمتين: الوظيفة المنفذة
الديكور والوظيفة التي يتم تزيينها. يمكن أن يكون هناك أكثر من وظيفة ديكور واحدة
مُطبَّق؛ سيتم تطبيقها بالترتيب من الأبعد إلى الأعمق، أي. الأول
سيكون مصمم الديكور هو الأبعد، وهكذا. يُطلق على المصممين الذين لديهم حجج اسم عادل
مثل استدعاء وظيفة.

(مع-مصمم الديكور-متعة
(تعريف بعض الوظائف [] ...)

(مع-مصمم ديكور1 ديكور2...
(تعريف بعض الوظائف [] ...)

(مع ديكور (ديكور arg) ..
(تعريف بعض الوظائف [] ...)

في المثال التالي ، inc-decorator يستخدم لتزيين الوظيفة إضافة مع
دالة تأخذ معلمتين وتستدعي الدالة المزخرفة بقيم
بنسبة 1. عندما زينت إضافة يتم استدعاؤه بالقيمتين 1 و1، النهاية
ستكون النتيجة 4(1 + 1 + 1 + 1).

=> (defn inc-decorator [func]
... (الجبهة الوطنية [القيمة-1 القيمة-2] (الوظيفة (+ القيمة-1 1) (+ القيمة-2 1))))
=> (defn inc2-decorator [func]
... (الجبهة الوطنية [القيمة-1 القيمة-2] (الوظيفة (+ القيمة-1 2) (+ القيمة-2 2))))

=> (with-decorator inc-decorator (إضافة defn [ab] (+ ab)))
=> (إضافة 1 1)
4
=> (مع ديكور Inc2-ديكورات Inc-Decorator
... (إضافة التعريف [ab] (+ ab)))
=> (إضافة 1 1)
8

مع جينسيمز
الجديد في الإصدار 0.9.12

مع جينسيم يستخدم لتوليد مجموعة من com.gensym للاستخدام في الماكرو. الكود التالي:

(مع جينسيمز [اي بي سي]
...)

يتوسع إلى:

(دع [[أ (جينسيم)
[ب (جنسيم)
[ج (جنسيم)]]
...)

رؤية أيضا:
القسم باستخدام-gensym

محصول
محصول يتم استخدامه لإنشاء كائن منشئ يُرجع قيمة واحدة أو أكثر. المولد
قابل للتكرار وبالتالي يمكن استخدامه في الحلقات وقائمة الفهم وما شابه ذلك
يبني.

وظيفة أرقام عشوائية يوضح كيف يمكن استخدام المولدات لتوليد سلسلة لا نهائية
دون استهلاك كمية لا حصر لها من الذاكرة.

=> (ضرب التعريف [المعاملات الأساسية]
... (من أجل [[(، المعامل الأساسي) (معاملات القواعد الرمزية)]]
... (العائد (* المعامل الأساسي))))

=> (اضرب (النطاق 5) (النطاق 5))


=> (قيمة شركات القائمة [القيمة (الضرب (النطاق 10) (النطاق 10))])
[0، 1، 4، 9، 16، 25، 36، 49، 64، 81]

=> (استيراد عشوائي)
=> (تعريف الأرقام العشوائية [منخفض مرتفع]
... (بينما صحيح (العائد (.randint عشوائي منخفض مرتفع))))
=> (list-comp x [x (خذ 15 (أرقام عشوائية 1 50))])])
[7، 41، 6، 22، 32، 17، 5، 38، 18، 38، 17، 14، 23، 23، 19]

العائد من
الجديد في الإصدار 0.9.13

PYTHON 3.3 لأي لبس UP فقط!

العائد من يستخدم لاستدعاء مولد فرعي. هذا مفيد إذا كنت تريد أن يكون لديك كوروتين
تكون قادرة على تفويض عملياتها إلى كوروتين آخر، على سبيل المثال، في حالة استخدام شيء فاخر مثل
غير متزامن.

Hy جوهر
جوهر وظائف
ولكن أخيرا
الاستخدام: (ولكن أخيرا كول)

إرجاع مكرر لجميع العناصر باستثناء العنصر الأخير كول.

=> (القائمة (لكن الأخيرة (النطاق 10)))
[0 ، 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8]

=> (القائمة (لكن الأخيرة [1]))
[]

=> (القائمة (لكن الأخيرة []))
[]

=> (استيراد أدوات itertools)
=> (قائمة (خذ 5 (butlast (itertools.count 10))))
[10 ، 11 ، 12 ، 13 ، 14]

كول؟
الجديد في الإصدار 0.10.0

الاستخدام: (كول؟ x)

الإسترجاع : صواب if x قابل للتكرار وليس سلسلة.

=> (مجموعة؟ [1 2 3 4])
صواب

=> (مجموع؟ {"أ" 1 "ب" 2})
صواب

=> (كول؟ "اي بي سي")
خطأ

سلبيات
الجديد في الإصدار 0.10.0

الاستخدام: (سلبيات a b)

إرجاع خلية سلبيات جديدة بالسيارة a و مجلس الإنماء والإعمار b.

=> (setv a (cons 'hd 'tl))

=> (= 'hd (سيارة أ))
صواب

=> (= 'tl (cdr a))
صواب

سلبيات؟
الجديد في الإصدار 0.10.0

الاستخدام: (سلبيات؟ فو)

يتحقق ما إذا كان فو هي خلية سلبيات.

=> (setv a (cons 'hd 'tl))

=> (سلبيات؟ أ)
صواب

=> (سلبيات؟ لا شيء)
خطأ

=> (سلبيات؟ [1 2 3])
خطأ

ديسمبر
الاستخدام: (ديسمبر x)

إرجاع واحد أقل من x. أي ما يعادل (- x 1). يرفع خطأ مطبعي if اذا لم تكن (رقمي؟ س)).

=> (3 ديسمبر)
2

=> (0 ديسمبر)
-1

=> (12.3 ديسمبر)
11.3

فك
الجديد في الإصدار 0.10.0

الاستخدام: (تفكيك شجرة &خياري [كودجن خطأ شنيع])

تخلص من Python AST لـ Hy شجرة لمعيار الإخراج. لو com.codegen is صواب، الوظيفة
يطبع رمز بايثون بدلا من ذلك.

=> (تفكيك '(اطبع "Hello World!"))
وحدة(
الجسم=[
Expr(value=Call(func=Name(id='print'), args=[Str(s='Hello World!')], الكلمات الرئيسية=[], starargs=None, kwargs=None))])

=> (تفكيك '(اطبع "Hello World!") صحيح)
طباعة ("مرحبا بالعالم!")

فارغ؟
الاستخدام: (فارغ؟ كول)

الإسترجاع : صواب if كول فارغ. أي ما يعادل (= 0 (لين كول)).

=> (فارغ؟ [])
صواب

=> (فارغة؟ "")
صواب

=> (فارغ؟ (، 1 2))
خطأ

كل؟
الجديد في الإصدار 0.10.0

الاستخدام: (كل؟ قبل كول)

الإسترجاع : صواب if (ما قبل x) صحيح منطقي لكل x in كول، وإلا خطأ. إرجاع صواب
if كول فارغ.

=> (كل؟ حتى؟ [2 4 6])
صواب

=> (كل؟ حتى؟ [1 3 5])
خطأ

=> (كل؟ حتى؟ [2 4 5])
خطأ

=> (كل؟ حتى؟ [])
صواب

يطفو؟
الاستخدام: (يطفو؟ x)

الإسترجاع : صواب if x هو تعويم.

=> (تعويم؟ 3.2)
صواب

=> (تعويم؟ -2)
خطأ

حتى؟
الاستخدام: (حتى؟ x)

الإسترجاع : صواب if x هو حتى. يرفع خطأ مطبعي if اذا لم تكن (رقمي؟ س)).

=> (حتى؟ 2)
صواب

=> (حتى؟ 13)
خطأ

=> (حتى؟ 0)
صواب

هوية
الاستخدام: (هوية x)

إرجاع الوسيطة المقدمة للوظيفة.

=> (الهوية 4)
4

=> (القائمة (هوية الخريطة [1 2 3 4]))
[1 2 3]

المؤتمر الوطني العراقي
الاستخدام: (شركة x)

إرجاع واحد أكثر من x. أي ما يعادل (+ x 1). يرفع خطأ مطبعي if اذا لم تكن (رقمي؟ س)).

=> (بما في ذلك 3)
4

=> (بما في ذلك 0)
1

=> (بما في ذلك 12.3)
13.3

مثال؟
الاستخدام: (مثال؟ فئة x)

الإسترجاع : صواب if x هو مثال فئة.

=> (مثال؟ تعويم 1.0)
صواب

=> (مثال؟ كثافة العمليات 7)
صواب

=> (مثال؟ str (str "foo"))
صواب

=> (إلغاء تصنيف TestClass [كائن])
=> (setv inst (TestClass))
=> (مثال؟ TestClass inst)
صواب

عدد صحيح؟
الاستخدام: (عدد صحيح؟ x)

الإسترجاع : صواب if x هو عدد صحيح. بالنسبة لبيثون 2، هذا أيضًا مادبا or التداول الطويل. بالنسبة لبيثون 3،
وهذا هو مادبا.

=> (عدد صحيح؟ 3)
صواب

=> (عدد صحيح؟ -2.4)
خطأ

تشابك
الجديد في الإصدار 0.10.1

الاستخدام: (تشابك تسلسل 1 تسلسل 2 ...)

إرجاع عنصر قابل للتكرار للعنصر الأول في كل تسلسل، ثم العنصر الثاني، وما إلى ذلك.

=> (قائمة (تداخل (النطاق 5) (النطاق 100 105)))
[0، 100، 1، 101، 2، 102، 3، 103، 4، 104]

=> (القائمة (التداخل (النطاق 1000000) "abc"))
[0، 'أ'، 1، 'ب'، 2، 'ج']

تدخل
الجديد في الإصدار 0.10.1

الاستخدام: (يتدخل بند تسلسل)

إرجاع تكرار لعناصر التسلسل مفصولة بالعنصر.

=> (قائمة (توسط "!" "abcd"))
['ا ب ت ث']

=> (القائمة (توسط -1 (النطاق 5)))
[0، -1، 1، -1، 2، -1، 3، -1، 4]

متوقعة؟
الاستخدام: (متوقعة؟ x)

الإسترجاع : صواب if x قابل للتكرار. تقوم الكائنات القابلة للتكرار بإرجاع مكرر جديد عندما (ايتر x) is
مُسَمًّى. التباين مع مكرر؟.

=> ;; يعمل للسلاسل
=> (قابل للتكرار؟ (str "abcde"))
صواب

=> ;; يعمل للقوائم
=> (قابل للتكرار؟ [1 2 3 4 5])
صواب

=> ;; يعمل من أجل الصفوف
=> (قابل للتكرار؟ (، 1 2 3))
صواب

=> ;; يعمل من أجل الإملاء
=> (قابل للتكرار؟ {:a 1 :b 2 :c 3})
صواب

=> ;; يعمل للتكرارات/المولدات
=> (قابل للتكرار؟ (كرر 3))
صواب

مكرر؟
الاستخدام: (مكرر؟ x)

الإسترجاع : صواب if x هو مكرر. التكرارات هي كائنات تُرجع نفسها ككائن
التكرار متى (ايتر x) يسمى. التباين مع متوقعة؟.

=> ;; لا يعمل للحصول على قائمة
=> (المكرر؟ [1 2 3 4 5])
خطأ

=> ;; ولكن يمكننا الحصول على مكرر من القائمة
=> (مكرر؟ (مكرر [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 ، 2 ، 3 ، 4]

=> (القائمة* 1)
1

=> (السلبيات؟ (القائمة* 1 2 3 4))
صواب

توسيع نطاق
الجديد في الإصدار 0.10.0

الاستخدام: (توسيع كبير شكل)

إرجاع التوسع الكلي الكامل لـ النموذج المرفق.

=> (توسيع كبير '(-> (أب) (xy)))
(u'x' (u'a' u'b') u'y')

=> (توسيع كبير '(-> (ab) (-> (cd) (ef))))
(u'e' (u'c' (u'a' u'b') u'd') u'f')

التوسع الكلي-1
الجديد في الإصدار 0.10.0

الاستخدام: (ماكروتوسيع-1 شكل)

إرجاع توسيع الماكرو خطوة واحدة ل النموذج المرفق.

=> (ماكروكسباند-1 '(-> (ab) (-> (cd) (ef))))
(u'_>' (u'a' u'b') (u'c' u'd') (u'e' u'f'))

يدمج مع
الجديد في الإصدار 0.10.1

الاستخدام: (يدمج مع f &استراحة خرائط)

إرجاع خريطة تتكون من بقية الخرائط التي تم ضمها أولاً. إذا حدث مفتاح في
أكثر من خريطة واحدة، سيتم دمج الخرائط من الأخيرة (من اليسار إلى اليمين).
التعيين في النتيجة عن طريق الاتصال (f فال في النتيجة فال في الأخير).

=> (دمج مع (fn [xy] (+ xy)) {"a" 10 "b" 20} {"a" 1 "c" 30})
{u'a': 11L، u'c': 30L، u'b': 20L}

نفي؟
الاستخدام: (نيج؟ x)

الإسترجاع : صواب if x أقل من الصفر. يرفع خطأ مطبعي if اذا لم تكن (رقمي؟ س)).

=> (نيج؟ -2)
صواب

=> (نيج؟ 3)
خطأ

=> (نيج؟ 0)
خطأ

لا شيء؟
الاستخدام: (لا شيء؟ x)

الإسترجاع : صواب if x is صفر / بدون اضاءة.

=> (صفر؟ لا شيء)
صواب

=> (صفر؟ لا شيء)
صواب

=> (صفر؟ 0)
خطأ

=> (ستف × لا شيء)
=> (صفر؟ س)
صواب

=> ;; list.append يُرجع دائمًا بلا
=> (لا شيء؟ (.إلحاق [1 2 3] 4))
صواب

لا شيء؟
الاستخدام: (لا أحد؟ x)

الإسترجاع : صواب if x is بدون اضاءة.

=> (لا شيء؟ لا شيء)
صواب

=> (لا شيء؟ 0)
خطأ

=> (سيتف × لا شيء)
=> (لا شيء؟ س)
صواب

=> ;; list.append يُرجع دائمًا بلا
=> (لا شيء؟ (.إلحاق [1 2 3] 4))
صواب

نطة
الاستخدام: كول n &خياري [إفتراضي لا شيء])

إرجاع n- العنصر في المجموعة، العد من 0. قم بإرجاع القيمة الافتراضية، صفر، إذا
خارج الحدود (ما لم ينص على خلاف ذلك). يرفع خطأ القيمة if n سلبي.

=> (ن [1 2 4 7] 1)
2

=> (ن [1 2 4 7] 3)
7

=> (لا شيء؟ (ن [1 2 4 7] 5))
صواب

=> (ن [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)
خطأ

نقاط البيع؟
الاستخدام: (نقاط البيع؟ x)

الإسترجاع : صواب if x أكبر من الصفر. يرفع خطأ مطبعي if اذا لم تكن (رقمي؟ س)).

=> (الموضع؟ 3)
صواب

=> (نقطة البيع؟ -2)
خطأ

=> (الموضع؟ 0)
خطأ

ثان
الاستخدام: (ثانيا كول)

إرجاع العضو الثاني ل كول. أي ما يعادل (احصل على كول 1).

=> (الثانية [0 1 2])
1

بعض
الجديد في الإصدار 0.10.0

الاستخدام: (بعض قبل كول)

تُرجع أول قيمة صحيحة منطقيًا لـ (ما قبل x) لأي x in كول، وإلا صفر.
الإرجاع صفر if كول فارغ.

=> (البعض حتى؟ [2 4 6])
صواب

=> (لا شيء؟ (بعضها متساوي؟ [1 3 5]))
صواب

=> (لا شيء؟ (بعض الهوية [0 "" []])))
صواب

=> (بعض الهوية [0 "سلسلة غير فارغة" []])
"سلسلة غير فارغة"

=> (لا شيء؟ (حتى البعض؟ []))
صواب

خيط؟
الاستخدام: (خيط؟ x)

الإسترجاع : صواب if x عبارة عن سلسلة.

=> (سلسلة؟ "فو")
صواب

=> (سلسلة؟ -2)
خطأ

رمز؟
الاستخدام: (رمز؟ x)

الإسترجاع : صواب if x هو رمز.

=> (الرمز؟ 'foo)
صواب

=> (الرمز؟ '[اي بي سي])
خطأ

صفر؟
الاستخدام: (صفر؟ x)

الإسترجاع : صواب if x صفر.

=> (صفر؟ 3)
خطأ

=> (صفر؟ -2)
خطأ

=> (صفر؟ 0)
صواب

تسلسل وظائف
يمكن لوظائف التسلسل إما أن تنشئ أو تعمل على تسلسل لا نهائي محتمل بدون
تتطلب تحقيق التسلسل بالكامل في قائمة أو حاوية مماثلة. يفعلون ذلك من خلال
إرجاع مكرر بايثون.

يمكننا استخدام مولد أرقام فيبوناتشي اللانهائي كمثال لكيفية الاستخدام
بعض هذه الوظائف.

(تعريف الأكذوبة []
(سيتف أ 0)
(سيتف ب 1)
(احيانا صحيح
(العائد أ)
(سيتف (، أ ب) (، ب (+ أ ب)))))

لاحظ ال (في حين صحيح ...) حلقة. إذا قمنا بتشغيل هذا في REPL،

=> (كذوبة)


يؤدي استدعاء الوظيفة إلى إرجاع مكرر فقط، ولكنه لا يعمل حتى نستهلكه.
لا يُنصح بتجربة شيء كهذا لأن الحلقة اللانهائية ستعمل حتى ذلك
يستهلك كل ذاكرة الوصول العشوائي المتاحة، أو في هذه الحالة حتى أقتلها.

=> (قائمة (كذبة))
[1] 91474 قتيلاً

للحصول على أول 10 أرقام فيبوناتشي، استخدم أخذ. لاحظ أن أخذ كما يعود مولد،
لذلك أقوم بإنشاء قائمة منه.

=> (قائمة (خذ 10 (كذبة))
[0، 1، 1، 2، 3، 5، 8، 13، 21، 34]

للحصول على رقم فيبوناتشي عند الفهرس 9 (بدءاً من 0):

=> (ن (فيبر) 9)
34

دورة
الاستخدام: (دورة كول)

إرجاع مكرر لا نهائي لأعضاء Coll.

=> (القائمة (خذ 7 (دورة [1 2 3])))
[1 و 2 و 3 و 1 و 2 و 3 و 1]

=> (القائمة (خذ 2 (دورة [1 2 3])))
[1، 2]

خامد
الاستخدام: (متميز كول)

إرجاع مكرر يحتوي فقط على الأعضاء الفريدين كول.

=> (قائمة (مميزة [ 1 2 3 4 3 5 2 ]))
[1 ، 2 ، 3 ، 4 ، 5]

=> (قائمة (مميزة []))
[]

=> (قائمة (مميزة (iter [ 1 2 3 4 3 5 2 ])))
[1 ، 2 ، 3 ، 4 ، 5]

قطرة
الاستخدام: (يسقط n كول)

إرجاع مكرر، وتخطي الأول n اعضاء في كول. يرفع خطأ القيمة 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]))
[1 ، 2 ، 3 ، 4 ، 5]

=> (القائمة (أسقط 6 [1 2 3 4 5]))
[]

آخر قطرة
الاستخدام: (آخر قطرة n كول)

إرجاع مكرر للجميع ما عدا الأخير n العناصر الموجودة في كول. يرفع خطأ القيمة if n is
نفي.

=> (القائمة (آخر 5 (النطاق 10 20)))
[10 ، 11 ، 12 ، 13 ، 14]

=> (القائمة (آخر 0 (النطاق 5)))
[0 ، 1 ، 2 ، 3 ، 4]

=> (القائمة (آخر 100 (النطاق 100)))
[]

=> (استيراد أدوات itertools)
=> (القائمة (خذ 5 (آخر 100 (itertools.count 10))))
[10 ، 11 ، 12 ، 13 ، 14]

إسقاط بينما
الاستخدام: (إسقاط الوقت قبل كول)

إرجاع مكرر، وتخطي أعضاء كول حتى قبل is خطأ.

=> (قائمة (حتى أثناء الإسقاط؟ [2 4 7 8 9]))
[7 و 8 و 9]

=> (قائمة (إسقاط رقمي؟ [1 2 3 لا شيء "أ")])))
[لا شيء، أ']

=> (قائمة (أثناء نقاط البيع؟ [2 4 7 8 9]))
[]

تصفية
الاستخدام: (منقي قبل كول)

إرجاع مكرر لجميع العناصر الموجودة في كول التي تمر المسند قبل.

انظر أيضا إزالة.

=> (القائمة (موضع التصفية؟ [1 2 3 -4 5 -7]))
[1 ، 2 ، 3 ، 5]

=> (قائمة (التصفية حتى؟ [1 2 3 -4 5 -7]))
[2، -4]

تسطح
الجديد في الإصدار 0.9.12

الاستخدام: (تتسطح كول)

إرجاع قائمة واحدة بجميع العناصر الموجودة فيها كول، عن طريق تسوية جميع القوائم و/أو الموجودة
الصفوف.

=> (تسطيح [1 2 [3 4] 5])
[1 ، 2 ، 3 ، 4 ، 5]

=> (تسطيح ["foo" (, 1 2) [1 [2 3] 4] "bar"])
["فو"، 1، 2، 1، 2، 3، 4، "شريط"]

أعاد
الاستخدام: (أعاد fn x)

إرجاع مكرر لـ x, الجبهة الوطنية (خ), الجبهة الوطنية (الجبهة الوطنية (خ))، الخ.

=> (القائمة (خذ 5 (كرر بما في ذلك 5)))
[5 ، 6 ، 7 ، 8 ، 9]

=> (القائمة (خذ 5 (كرر (fn [x] (* xx)) 5)))
[5 ، 25 ، 625 ، 390625 ، 152587890625]

اقرأ
الاستخدام: (اقرأ &خياري [من - الملف eof])

يقرأ تعبير Hy التالي من من - الملف (الافتراضي إلى sys.stdin)، ويمكن أن يستغرق
بايت واحد كـ EOF (الإعداد الافتراضي هو سلسلة فارغة). يرفع خطأ if من - الملف ينتهي قبل
يمكن تحليل التعبير الكامل.

=> (اقرأ)
(+2 2)
('+' 2 2)
=> (تقييم (قراءة))
(+2 2)
4

=> (استيراد الإدخال والإخراج)
=> (def buffer (io.StringIO "(+ 2 2)\n(- 2 1)"))
=> (التقييم (تطبيق القراءة [] {"from_file" buffer}))
4
=> (التقييم (تطبيق القراءة [] {"from_file" buffer}))
1

=> ; بافتراض أن "example.hy" يحتوي على:
=> ; (طباعة "مرحبا")
=> ; (اطبع "أصدقاء!")
=> (مع [[f (افتح "example.hy")]]
... (يحاول
... (احيانا صحيح
... (دع [[exp (اقرأ f)]]
... (يفعل
... (اطبع "OHY" exp)
... (تقييم إكسب))))
... (التقاط [EOFError]
... (اطبع "EOF!"))))
OHY ("طباعة" "مرحبًا")
مرحبا
OHY ('اطبع' 'hyfriends!')
هاي فريندز!
EOF!

إزالة
الاستخدام: (إزالة قبل كول)

إرجاع مكرر من كول مع العناصر التي تمر المسند، قبل، إزالة.

انظر أيضا تصفية.

=> (القائمة (هل تريد إزالة الرقم الغريب؟ [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 مراراً وتكراراً.

=> (استيراد [عشوائي [randint]])

=> (قائمة (خذ 5 (بشكل متكرر (fn [] (randint 0 10)))))
[6 ، 2 ، 0 ، 6 ، 7]

أخذ
الاستخدام: (يأخذ n كول)

إرجاع مكرر يحتوي على الأول n اعضاء في كول. يرفع خطأ القيمة if n is
نفي.

=> (القائمة (خذ 3 [1 2 3 4 5]))
[1 و 2 و 3]

=> (القائمة (خذ 4 (كرر "s")))
[أنت، أنت، أنت، أنت]

=> (القائمة (خذ 0 (كرر "s")))
[]

خذ ن
الاستخدام: (خذ ن n كول)

إرجاع مكرر يحتوي على كل n-العضو ال كول.

=> (القائمة (خذ 2 [1 2 3 4 5 6 7]))
[1 ، 3 ، 5 ، 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]

خذ بعض الوقت
الاستخدام: (خذ بعض الوقت قبل كول)

إرجاع مكرر من كول طالما قبل عائدات صواب.

=> (قائمة (أخذ وقت في العمل؟ [ 1 2 3 -4 5]))
[1 و 2 و 3]

=> (قائمة (أخذ وقت سلبي؟ [ -4 -3 1 2 5]))
[-4، -3]

=> (قائمة (خذ وقتا سلبيا؟ [ 1 2 3 -4 5]))
[]

zipwith
الجديد في الإصدار 0.9.13

الاستخدام: (zipwith fn كول ...)

أي ما يعادل الرمز البريدي، ولكنه يستخدم دالة متعددة الوسائط بدلاً من إنشاء صف. لو
zipwith يتم استدعاؤه بمجموعات N، إذن fn يجب أن تقبل الحجج N.

=> (عامل الاستيراد)
=> (قائمة (zipwith عامل التشغيل. إضافة [1 2 3] [4 5 6]))
[5 و 7 و 9]

قارئ وحدات الماكرو
تمنح وحدات ماكرو القارئ Lisp القدرة على تعديل وتغيير بناء الجملة بسرعة. أنت لا تريد
التدوين البولندي؟ يمكن لقارئ الماكرو أن يفعل ذلك بسهولة. هل تريد طريقة Clojure للحصول على
التعبير العادي؟ يمكن لوحدات ماكرو القارئ أيضًا القيام بذلك بسهولة.

بناء الجملة
=> (أداة إزالة القراءة ^ [expr] (طباعة expr))
=> #^(1 2 3 4)
(1 2 3 4)
=> #^"مرحبا"
"مرحبا"
=> #^1+2+3+4+3+2
1+2+3+4+3+2

Hy ليس لديه حرفية للصفوف. دعنا نقول أنك لا تحب (, ...) وتريد شيئا آخر. هذا
هي مشكلة يستطيع قارئ وحدات الماكرو حلها بطريقة مرتبة.

=> (أداة إزالة القراءة t [expr] `(, ~@expr))
=> #ر(1 2 3)
(1، 2، 3)

يمكنك حتى القيام بذلك مثل Clojure والحصول على حرفية للتعبيرات العادية!

=> (إعادة الاستيراد)
=> (أداة إلغاء القراءة r [expr] `(re.compile ~expr))
=> #r".*"
<_sre.SRE_Pattern كائن في 0xcv7713ph15#>

تطبيق
مزيل الخوف يأخذ حرفًا واحدًا كاسم رمز لماكرو القارئ؛ أي شيء أطول
سوف يعود خطأ. من ناحية التنفيذ، مزيل الخوف يتوسع إلى لامدا مغطاة ب
مصمم ديكور. يحفظ مصمم الديكور هذا لامدا في القاموس باسم الوحدة النمطية الخاصة به و
رمز.

=> (أداة إزالة القراءة ^ [expr] (طباعة expr))
;=> (with_decorator (hy.macros.reader ^) (fn [expr] (print expr)))

# يتوسع إلى (dispatch_reader_macro ...) حيث يتم تمرير الرمز والتعبير إلى
الوظيفة الصحيحة.

=> #^()
;=> (dispatch_reader_macro ^ ())
=> #^"مرحبا"
"مرحبا"

تحذير:
نظرًا لوجود قيود في المعجم والمحلل اللغوي الخاص بـ Hy، لا يمكن إعادة تعريف وحدات ماكرو القارئ المحددة
بناء الجملة مثل ()[]{}. على الأرجح سيتم معالجة هذا في المستقبل.

داخلي Hy توثيق
NOTE:
تعتبر هذه البتات مفيدة في الغالب للأشخاص الذين يقومون باختراق Hy نفسه، ولكن يمكن استخدامها أيضًا
أولئك الذين يتعمقون بشكل أعمق في برمجة الماكرو.

Hy الموديلات
المُقدّمة إلى Hy الموديلات
نماذج Hy عبارة عن طبقة رقيقة جدًا فوق كائنات Python العادية، والتي تمثل مصدر Hy
رمز كبيانات. تضيف النماذج فقط معلومات موضع المصدر، وهناك عدد قليل من الطرق لذلك
دعم المعالجة النظيفة لكود مصدر Hy، على سبيل المثال في وحدات الماكرو. لتحقيق ذلك
الهدف، نماذج Hy عبارة عن مزيج من فئة Python الأساسية و HyObject.

HyObject
hy.models.HyObject هي الفئة الأساسية لنماذج Hy. فهو يطبق طريقة واحدة فقط، يحل محل,
الذي يستبدل موضع المصدر للكائن الحالي بالموضع الذي تم تمريره كوسيطة.
يتيح لنا ذلك تتبع الموضع الأصلي للتعبيرات التي تم تعديلها بواسطة
وحدات الماكرو، سواء كان ذلك في المترجم أو في وحدات الماكرو النقية.

HyObject ليس المقصود استخدامه مباشرة لإنشاء نماذج Hy، ولكن فقط كمزيج
لفئات أخرى.

مركب الموديلات
يتم تحليل القوائم بين قوسين وبين قوسين كنماذج مركبة بواسطة المحلل اللغوي Hy.

HyList
hy.models.list.HyList هي الفئة الأساسية لنماذج Hy "القابلة للتكرار". استخدامه الأساسي هو
تكون بين قوسين [] القوائم، والتي عند استخدامها كتعبير عالي المستوى، يتم ترجمتها إلى
قائمة بايثون الحرفية في مرحلة التجميع.

تؤدي إضافة HyList إلى كائن آخر قابل للتكرار إلى إعادة استخدام فئة الكائن الموجود على الجانب الأيسر،
وهو سلوك مفيد عندما تريد ربط كائنات Hy في ماكرو، على سبيل المثال.

HyExpression
hy.models.expression.HyExpression يرث HyList بين قوسين () التعبيرات. ال
تعتمد نتيجة تجميع تلك التعبيرات على العنصر الأول من القائمة:
يقوم المترجم بإرسال التعبيرات بين النماذج الخاصة للمترجم ووحدات الماكرو المعرفة من قبل المستخدم و
استدعاءات دالة بايثون العادية.

HyDict
hy.models.dict.HyDict يرث HyList لقوسين مجعد {} التعبيرات التي تجمع
وصولاً إلى قاموس بايثون الحرفي.

قرار استخدام القائمة بدلاً من الإملاء كفئة أساسية لـ HyDict يسمح أسهل
معالجة الإملاءات في وحدات الماكرو، مع ميزة إضافية تتمثل في السماح بالتعبيرات المركبة
كمفاتيح الإملاء (مثل، على سبيل المثال، HyExpression فئة بايثون غير قابلة للتجزئة).

الذري الموديلات
في دفق الإدخال، السلاسل ذات علامات الاقتباس المزدوجة، مع احترام تدوين Python للسلاسل،
يتم تحليلها كرمز مميز واحد، والذي يتم تحليله مباشرة كرمز HyString.

سلسلة متواصلة من الأحرف، باستثناء المسافات والأقواس وعلامات الاقتباس وعلامات الاقتباس المزدوجة
والتعليقات، يتم تحليلها كمعرف.

يتم حل المعرفات للنماذج الذرية أثناء مرحلة التحليل بالترتيب التالي:

· HyInteger

· HyFloat

· هايكومبليكس (إذا لم تكن الذرة عارية j)

· HyKeyword (إذا كانت الذرة تبدأ بـ :)

· HySymbol

HyString
hy.models.string.HyString هي الفئة الأساسية لنماذج Hy المكافئة للسلسلة. إنه أيضًا
يمثل سلسلة حرفية ذات علامات اقتباس مزدوجة، ""، والتي يتم تجميعها إلى سلسلة Unicode
الحروف في بايثون. HyStrings ترث كائنات Unicode في Python 2، وكائنات السلسلة في
Python 3 (وبالتالي لا تعتمد على التشفير).

HyString النماذج القائمة غير قابلة للتغيير.

يمكن أن تمتد سلاسل Hy الحرفية على عدة أسطر، ويعتبرها المحلل اللغوي بمثابة سلسلة واحدة
وحدة، مع احترام هروب بايثون لسلاسل يونيكود.

رقمية الموديلات
hy.models.integer.HyInteger يمثل عددًا صحيحًا حرفيًا (باستخدام التداول الطويل اكتب على بايثون 2,
و مادبا على بيثون 3).

hy.models.float.HyFloat يمثل حرفية الفاصلة العائمة.

hy.models.complex.HyComplex يمثل حرفية معقدة.

يتم تحليل النماذج الرقمية باستخدام روتين بايثون المقابل، وبيثون رقمي صالح
سيتم تحويل الأحرف الحرفية إلى نظيرتها Hy.

HySymbol
hy.models.symbol.HySymbol هو النموذج المستخدم لتمثيل الرموز في لغة Hy. هو - هي
يرث HyString.

HySymbol يتم تشويه الكائنات في مرحلة التحليل، لمساعدة قابلية التشغيل البيني لبايثون:

· الرموز المحاطة بالنجوم (*) يتم تحويلها إلى أحرف كبيرة؛

· الشرطات (-) يتم تحويلها إلى شرطات سفلية (_);

· علامة استفهام زائدة واحدة (?) يتحول إلى الرائدة يكون_.

تحذير: بما أن عملية التشويه تتم أثناء مرحلة التحليل، فمن الممكن حدوث ذلك
قم بإنشاء HySymbols برمجيًا والتي لا يمكن إنشاؤها باستخدام كود مصدر Hy. مثل هذا
يتم استخدام الآلية بواسطة gensym لإنشاء رموز "غير محصورة".

HyKeyword
hy.models.keyword.HyKeyword يمثل الكلمات الرئيسية في Hy. الكلمات الرئيسية هي رموز تبدأ بـ
a :. الطبقة ترث HyString.

ليفرق كلمات رئيسية تبدأ من HySymbols، دون احتمال (لا إرادي)
Clams، حرف Unicode للاستخدام الخاص "\uFDD0" مُلحق بالكلمة الأساسية الحرفية
قبل التخزين.

سلبيات خلايا
hy.models.cons.HyCons هو تمثيل لبيثون ودية سلبيات الخلايا. خلايا السلبيات هي
مفيد بشكل خاص لتقليد ميزات متغيرات LISP "المعتادة" مثل Scheme أو Common
لثغة.

خلية السلبيات هي كائن مكون من عنصرين، يحتوي على أ سيارة (الرأس) و أ مجلس الإنماء والإعمار (ذيل). في بعض اللثغة
المتغيرات، خلية السلبيات هي لبنة البناء الأساسية، وتعبيرات S هي في الواقع
يتم تمثيلها كقوائم مرتبطة بخلايا السلبيات. وهذا ليس هو الحال في هاي، كما جرت العادة
التعبيرات مصنوعة من قوائم بايثون ملفوفة في ملف HyExpression. ومع ذلك، فإن هيكونز
يحاكي سلوك متغيرات Lisp "المعتادة" على النحو التالي:

· (سلبيات شيء لا شيء) is ( هاي اكسبريشن [شئ ما])

· (سلبيات شيء بعض القائمة) is ((يكتب بعض القائمة) (+ [شئ ما] بعض القائمة)) (إذا
بعض القائمة يرث من قائمة).

· (احصل على (سلبيات a b) 0) is a

· (شريحة (سلبيات a b) 1) is b

يدعم Hy بناء جملة القائمة المنقطة، حيث '(أ . b) يعني (سلبيات 'a 'ب) و '(أ b . c) يعني
(سلبيات 'a (سلبيات 'b 'ج)). إذا واجه المترجم خلية سلبيات في المستوى الأعلى، فسيتم رفعها
خطأ في التجميع.

هيكونز يغلف الوسائط التي تم تمريرها (car وcdr) بأنواع Hy، لتسهيل التعامل معها
خلايا السلبيات في سياق الماكرو.

Hy داخلي شهادة ذكاء الأعمال
نبذة
تعمل عناصر Hy الداخلية من خلال العمل كواجهة أمامية لرمز Python الثانوي، بحيث تكون Hy نفسها
يتم تجميعه إلى Python Bytecode، مما يسمح بوقت تشغيل Python غير معدل لتشغيل Hy code،
دون حتى أن ألاحظ ذلك.

الطريقة التي نقوم بها بذلك هي من خلال ترجمة Hy إلى بنية بيانات Python AST الداخلية، و
بناء ذلك AST في كود Python الثانوي باستخدام وحدات من معيار Python
مكتبة، حتى لا نضطر إلى تكرار جميع أعمال بايثون الداخلية لكل منها
إصدار بايثون واحد.

يعمل Hy على أربع مراحل. ستغطي الأقسام التالية كل خطوة من خطوات Hy من المصدر إلى
مدة العرض.

خطوات 1 و 2: Tokenizing و توزيع
المرحلة الأولى من تجميع Hy هي تحويل المصدر إلى رموز يمكننا التعامل معها. نحن
استخدم مشروعًا يسمى rply، وهو محلل جميل (وسريع) ومكتوب في مجموعة فرعية
من بايثون يسمى rpython.

تم تعريف كل رمز lexing في hy.lex.lexer. هذا الرمز في الغالب يحدد Hy
القواعد، ويتم التعامل مع جميع الأجزاء الصعبة الفعلية بواسطة rply - نحن نحدد فقط
"عمليات الاسترجاعات" لـ rply in hy.lex.parser، الذي يأخذ الرموز المميزة التي تم إنشاؤها، ويعيد ملف
نماذج هاي.

يمكنك التفكير في نماذج Hy باعتبارها "AST" لـ Hy، وهي ما تعمل عليه وحدات الماكرو
(مباشرة)، وهو ما يستخدمه المترجم عندما يقوم بتجميع Hy.

رؤية أيضا:
القسم Hy الموديلات لمزيد من المعلومات حول نماذج Hy وماذا تعني.

خطوة 3: Hy مجموعة إلى بايثون AST
هذا هو المكان الذي يحدث فيه معظم السحر في Hy. هذا هو المكان الذي نأخذ فيه Hy AST (النماذج)،
وتجميعها في Python AST. تحدث بعض الأشياء غير التقليدية هنا لتتجاوز بضعة أشياء
المشاكل في AST، والعمل في المترجم هو من أهم الأعمال التي نقوم بها
لديك.

المترجم معقد بعض الشيء، لذا لا تشعر بالسوء إذا لم تخطئ في اللقطة الأولى،
قد يستغرق الأمر بعض الوقت حتى يصبح صحيحًا.

نقطة الدخول الرئيسية للمترجم هي HyASTCompiler.compile. يتم استدعاء هذه الطريقة، و
الطريقة "العامة" الحقيقية الوحيدة في الفصل (أي أننا لا نعد حقًا بـ
واجهة برمجة التطبيقات (API) تتجاوز تلك الطريقة).

في الواقع، حتى داخليًا، لا نعود بشكل مباشر إلا نادرًا، بل نجبر دائمًا تقريبًا
شجرة Hy من خلال جمع، وغالبًا ما يتم ذلك باستخدام العناصر الفرعية للتعبير
التي لدينا. الأمر متروك للمرسل على أساس النوع لإرسال العناصر الفرعية بشكل صحيح.

يتم تمييز كافة الأساليب التي تشكل التجميع بعلامة @يبني() مصمم ديكور. أنت تستطيع
إما أن تقوم بتمرير فئة نموذج Hy الذي يجمعه، أو يمكنك استخدام سلسلة له
التعبيرات. سأوضح هذا في ثانية.

الاسم الأول المسرح نوع الإرسال
لنبدأ في جمع طريقة. أول شيء نقوم به هو التحقق من نوع الشيء
نحن نبني. نحن نتطلع لمعرفة ما إذا كان لدينا طريقة يمكنها بناء يكتب() أننا
لديك، وإرسالها إلى الطريقة التي يمكن التعامل معها. إذا لم يكن لدينا أي وسائل يمكن ذلك
بناء هذا النوع، نرفع الداخلية استثناء.

على سبيل المثال، إذا كان لدينا HyString، لدينا تقريبًا 1 إلى 1 من Hy AST إلى Python
أست. ال compile_string طريقة يأخذ HyString، وإرجاع ملف أست.ستر () اعثر على المكان المناسب لك
يتم ملؤها بأرقام الأسطر والمحتوى الصحيح.

توسيع الماكرو
إذا حصلنا على HyExpression، سنحاول معرفة ما إذا كان هذا ماكرو معروفًا، ثم ندفع للحصول عليه
توسعت بالاستدعاء hy.macros.macroexpand، ثم ادفع النتيجة مرة أخرى إلى الداخل
HyASTCompiler.compile.

الثاني المسرح التعبير-إيفاد
الحالة الخاصة الوحيدة هي HyExpression، لأننا نحتاج إلى إنشاء AST مختلفًا اعتمادًا على ذلك
على النموذج الخاص المذكور. على سبيل المثال، عندما وصلنا إلى (إذا صحيح صحيح خاطئة)، ونحن
بحاجة إلى توليد أ أست.إذا، وقم بتجميع العقد الفرعية بشكل صحيح. هذا هو المكان @يبني()
مع سلسلة كوسيطة تأتي.

بالنسبة ترجمة_التعبير (والذي تم تعريفه بـ @builds(HyExpression)) سوف ترسل
بناءً على سلسلة الوسيطة الأولى. إذا، لسبب ما، الحجة الأولى ليست كذلك
سلسلة، فإنه سيتعامل مع هذه الحالة بشكل صحيح أيضًا (على الأرجح عن طريق رفع ملف استثناء).

إذا لم تكن السلسلة معروفة لـ Hy، فسيتم إنشاء ملف افتراضيًا ast.Call، والتي سوف تحاول
قم بإجراء مكالمة وقت التشغيل (في Python، شيء من هذا القبيل فو ()).

قضايا ضرب مع بايثون AST
Python AST رائع؛ إنه ما مكننا من كتابة مثل هذا المشروع القوي فوق
بايثون دون الاضطرار إلى محاربة بايثون بشدة. مثل أي شيء آخر، لقد حصلنا على نصيبنا العادل منه
المشكلات، وإليك قائمة قصيرة بالمشكلات الشائعة التي قد تواجهها.

بايثون تميز ما بين المالية و التعبيرات.

قد لا يبدو هذا أمرًا مهمًا - في الواقع، بالنسبة لمعظم مبرمجي بايثون، هذا أمر مهم
سرعان ما أصبحت لحظة "حسنًا، نعم".

في بايثون، القيام بشيء مثل:

طباعة For x in نطاق(10): pass ، لان طباعة طباعة التعبيرات، و For ليس
التعبير، إنه بيان تدفق التحكم. اشياء مثل 1 + 1 هي التعبيرات، كما هي لامدا
x: 1 + x، ولكن ميزات اللغة الأخرى، مثل if, Forالطرق أو في حين هي تصريحات.

نظرًا لعدم وجود "قيمة" بالنسبة لبيثون، فإن هذا يجعل العمل في Hy أمرًا صعبًا، منذ القيام بشيء ما
مثل (مطبعة (إذا صحيح صحيح خطأ شنيع)) ليس شائعًا فحسب، بل هو متوقع.

ونتيجة لذلك، فإننا نقوم بتشويه الأشياء تلقائيًا باستخدام ملف نتيجة الكائن، حيث نقدم ما يصل إلى أي ast.stmt
التي تحتاج إلى تشغيل، واحد ast.expr التي يمكن استخدامها للحصول على قيمة أي شيء
تم تشغيله للتو. يقوم Hy بذلك عن طريق فرض مهمة على الأشياء أثناء التشغيل.

على سبيل المثال، هاي:

(طباعة (إذا كان صحيحا صحيحا خطأ))

سيتحول إلى:

إذا كان هذا صحيحا:
_mangled_name_here = صحيح
آخر:
_mangled_name_here = خطأ

اطبع _mangled_name_هنا

حسنًا، لقد كان هذا كذبًا بعض الشيء، لأننا قمنا بالفعل بتحويل هذا البيان إلى:

اطبع صحيح إذا كان صحيحًا وإلا خطأ

عن طريق إجبار الأشياء على ast.expr إذا استطعنا، ولكن الفكرة العامة لا تزال قائمة.

خطوة 4: بايثون البايت كود الناتج و وقت التشغيل
بعد اكتمال شجرة Python AST، يمكننا محاولة تجميعها في Python
bytecode عن طريق دفعه من خلاله وحدة التقييم. من الآن فصاعدا، لم نعد مسيطرين، و
بايثون تعتني بكل شيء. هذا هو السبب في أن أشياء مثل Python Tracebacks و PDB و
تعمل تطبيقات جانغو.

Hy وحدات الماكرو
باستخدام com.gensym For أكثر أمانا وحدات الماكرو
عند كتابة وحدات الماكرو، يجب على المرء توخي الحذر لتجنب التقاط المتغيرات الخارجية أو استخدامها
أسماء المتغيرات التي قد تتعارض مع رمز المستخدم.

سوف نستخدم مثال الماكرو الجبهة القومية الإسلامية (انظر
http://letoverlambda.com/index.cl/guest/chap3.html#sec_5 للحصول على وصف أكثر اكتمالا.)
الجبهة القومية الإسلامية هو مثال، شيء من هذا القبيل رقمية if، حيث استنادا إلى التعبير، واحد من
يتم استدعاء 3 أشكال اعتمادًا على ما إذا كان التعبير موجبًا أو صفرًا أو سالبًا.

قد تكون التمريرة الأولى شيئًا مثل:

(defmacro nif [expr pos-form صفر الشكل neg-form]
`(دع [[اسم غامض ~expr]]
(cond [(pos؟ اسم غامض) ~pos-form]
[(صفر؟ اسم غامض) ~شكل صفر]
[(neg؟ اسم غامض) ~neg-form]))))

أين اسم غامض هي محاولة لاختيار اسم متغير حتى لا يتعارض مع اسم آخر
شفرة. ولكن بطبيعة الحال، رغم حسن النية، إلا أن هذا لا يشكل ضمانة.

تم تصميم طريقة gensym لإنشاء رمز جديد وفريد ​​لمثل هذه المناسبة.
نسخة أفضل بكثير من الجبهة القومية الإسلامية سيكون:

(defmacro nif [expr pos-form صفر الشكل neg-form]
(دع [[g (gensym)]]
`(دع [[~g ~expr]]
(cond [(pos? ~g) ~pos-form]
[(صفر؟ ~g) ~شكل صفر]
[(neg؟ ~g) ~neg-form]))))

هذه حالة سهلة، حيث أن هناك رمزًا واحدًا فقط. ولكن إذا كانت هناك حاجة لعدة
gensym's هناك ماكرو ثانٍ مع gensyms يتوسع بشكل أساسي إلى سلسلة من اسمحوا
صياغات:

(مع جينسيمز [اي بي سي]
...)

يتوسع إلى:

(دع [[أ (جينسيم)
[ب (جنسيم)
[ج (جنسيم)]]
...)

لذلك إعادة كتابتنا الجبهة القومية الإسلامية ستبدو:

(defmacro nif [expr pos-form صفر الشكل neg-form]
(مع الجينات [ز]
`(دع [[~g ~expr]]
(cond [(pos? ~g) ~pos-form]
[(صفر؟ ~g) ~شكل صفر]
[(neg؟ ~g) ~neg-form]))))

أخيرًا، يمكننا إنشاء ماكرو جديد يقوم بكل هذا نيابةً عنا. ديماكرو/ز! سوف يستغرق
جميع الرموز التي تبدأ بـ g! والاتصال تلقائيا com.gensym مع ما تبقى من
رمز. لذا ز!أ قد يصبح (جينسيم "أ").

نسختنا النهائية من الجبهة القومية الإسلامية، بنيت مع ديماكرو/ز! يصبح:

(defmacro/g! nif [expr pos-form صفر الشكل neg-form]
`(دع [[~g!res ~expr]]
(cond [(pos? ~g!res) ~pos-form]
[(صفر؟ ~g!res) ~شكل صفر]
[(neg? ~g!res) ~neg-form]))))

فحص الماكرو الحجج و رفع الاستثناءات
Hy مترجم بنيت الإضافية

مساهم MODULES INDEX


المحتويات:

مجازي وحدات الماكرو
الجديد في الإصدار 0.9.12

وحدة وحدات الماكرو الجناسية تجعل البرمجة الوظيفية في Hy موجزة للغاية وسهلة التنفيذ
قراءة.
الماكرو المجازي هو نوع من وحدات الماكرو البرمجية التي تلتقط نموذجًا ما عن عمد
يتم توفيرها إلى الماكرو والتي يمكن الإشارة إليها بواسطة استعارة (تعبير يشير
إلى آخر). — ويكيبيديا (http://en.wikipedia.org/wiki/Anaphoric_macro)

وحدات الماكرو
ا ف ب إذا
الاستخدام: (ا ف ب-إذا (فو) (مطبعة هو - هي))

يقيم الشكل الأول للصدق، ويربطه به it في الصواب والخطأ
الفروع.

الخوخ
الاستخدام: (الخوخ [1 2 3 4 5] (مطبعة هو - هي))

قم بتقييم النموذج لكل عنصر في القائمة لمعرفة الآثار الجانبية.

AP في كل حين
الاستخدام: (في كل حين قائمة قبل الجسم)

قم بتقييم النموذج لكل عنصر حيث يعود النموذج المسند صواب.

=> (ap-each-while [1 2 3 4 5 6] (< it 4) (اطبعه))
1
2
3

خريطة AP
الاستخدام: (AP-خريطة النموذج المرفق قائمة)

يعمل الشكل المجازي للخريطة تمامًا مثل الخريطة العادية باستثناء ذلك بدلاً من الوظيفة
كائن يأخذ شكل Hy. الاسم الخاص it يرتبط بالكائن الحالي من
القائمة في التكرار.

=> (قائمة (ap-map (* it 2) [1 2 3]))
[2 و 4 و 6]

ap-خريطة-متى
الاستخدام: (AP-خريطة-متى com.predfn ممثل قائمة)

قم بتقييم التعيين على القائمة باستخدام دالة أصلية لتحديد وقت تطبيق
شكل.

=> (قائمة (ap-map-متى تكون غريبة؟ (* it 2) [1 2 3 4]))
[2 ، 2 ، 6 ، 4]

=> (قائمة (ap-map-متى حتى؟ (* it 2) [1 2 3 4]))
[1 ، 4 ، 3 ، 8]

مرشح AP
الاستخدام: (مرشح AP النموذج المرفق قائمة)

كما هو الحال مع خريطة AP نأخذ نموذجًا خاصًا بدلاً من الوظيفة لتصفية عناصر الملف
قائمة. الاسم الخاص it يرتبط بالعنصر الحالي في التكرار.

=> (قائمة (مرشح ap (> (* it 2) 6) [1 2 3 4 5]))
[4، 5]

رفض AP
الاستخدام: (ap-رفض النموذج المرفق قائمة)

هذه الوظيفة تفعل عكس ذلك مرشح AP، فهو يرفض العناصر المارة
فاعل . الاسم الخاص it يرتبط بالعنصر الحالي في التكرار.

=> (قائمة (ap-reject (> (* it 2) 6) [1 2 3 4 5]))
[1 و 2 و 3]

ap-dotimes
الأستعمال (ap-dotimes n الجسم)

هذه الوظيفة تقيم الجسم n مرات، مع المتغير الخاص it ملزمة من 0 إلى
1 ن. وهو مفيد للآثار الجانبية.

=> (سيتف ن [])
=> (ap-dotimes 3 (.append n it))
=> ن
[0 و 1 و 2]

ap-first
الأستعمال (AP-الأولى com.predfn قائمة)

ترجع هذه الدالة العنصر الأول الذي يمرر المسند أو بدون اضاءة، مع
متغير خاص it منضم إلى العنصر الحالي في التكرار.

=>(ap-first (> it 5) (النطاق 10))
6

ap-last
الأستعمال (أخيرًا com.predfn قائمة)

تقوم هذه الدالة بإرجاع العنصر الأخير الذي يمرر المسند أو بدون اضاءة، مع الخاص
متغير it منضم إلى العنصر الحالي في التكرار.

=>(ap-last (> it 5) (النطاق 10))
9

تقليل AP
الأستعمال (AP-تقليل النموذج المرفق قائمة &خياري القيمة البدائية)

تقوم هذه الدالة بإرجاع نتيجة تطبيق النموذج على أول عنصرين في الجسم و
تطبيق النتيجة والعنصر الثالث وما إلى ذلك حتى يتم استنفاد القائمة. اختياريا أ
يمكن توفير القيمة الأولية بحيث يتم تطبيق الوظيفة على القيمة الأولية و
العنصر الأول بدلا من ذلك. يؤدي هذا إلى كشف العنصر الذي يتم تكراره كـ it والتيار
القيمة المتراكمة كما لجنة التنسيق الإدارية.

=>(تقليل ap (+ it acc) (النطاق 10))
45

حلقة/تكرار
الجديد في الإصدار 0.10.0

حلقة / تكرر يوفر الماكرو للمبرمجين طريقة بسيطة لاستخدام تحسين الاتصال الخلفي (TCO)
في رمز Hy الخاص بهم.
الاستدعاء الخلفي هو استدعاء روتيني يحدث داخل إجراء آخر باعتباره نهائيًا
فعل؛ قد ينتج عنه قيمة إرجاع يتم إرجاعها فورًا بواسطة الاستدعاء
إجراء. إذا كان هناك أي استدعاء ينفذه الروتين الفرعي، فقد يؤدي في النهاية
إلى هذا الروتين الفرعي نفسه الذي يتم استدعاؤه مرة أخرى أسفل سلسلة الاتصال، وهو في وضع الذيل،
ويقال أن مثل هذا الروتين الفرعي يكون عوديًا، وهي حالة خاصة من التكرار.
تعد الاستدعاءات الخلفية مهمة لأنه يمكن تنفيذها دون إضافة مكدس جديد
الإطار إلى مكدس الاستدعاءات. ليست هناك حاجة إلى معظم إطار الإجراء الحالي
أكثر، ويمكن استبداله بإطار المكالمة الذيل. يمكن للبرنامج بعد ذلك القفز
إلى الروتين الفرعي المسمى. يعد إنتاج مثل هذا الرمز بدلاً من تسلسل المكالمات القياسي أمرًا ضروريًا
يسمى إزالة المكالمة الخلفية، أو تحسين المكالمة الخلفية. يسمح القضاء على المكالمة الخلفية
استدعاءات الإجراء في الموضع الخلفي ليتم تنفيذها بكفاءة مثل عبارات goto،
مما يسمح بالبرمجة المنظمة الفعالة. - ويكيبيديا (-
http://en.wikipedia.org/wiki/Tail_call)

وحدات الماكرو
حلقة
حلقة يؤسس نقطة العودية. مع حلقة, تكرر يعيد ربط المتغيرات المحددة في ملف
نقطة العودية ويرسل تنفيذ التعليمات البرمجية مرة أخرى إلى نقطة العودية تلك. لو تكرر يستخدم في
موضع غير ذيل، يتم طرح استثناء.

الاستخدام: (حلقة الارتباطات &استراحة الجسم)

على سبيل المثال:

(تتطلب hy.contrib.loop)

(مضروب التعريف [ن]
(حلقة [[في] [acc 1]]
(إذا (صفر؟ أنا)
لجنة التنسيق الإدارية
(يتكرر (ديسمبر i) (* acc i)))))

(مضروب 1000)

com.defmulti
الجديد في الإصدار 0.10.0

com.defmulti يتيح لك تحميل دالة بشكل زائد بعدد محدد من الوسائط و/أو kwargs.
مستوحاة من أسلوب كلوجر ديفين.

=> (تتطلب hy.contrib.multi)
=> (defmulti fun
... ([أ] "أ")
... ([أب] "أب")
... ([اي بي سي] "اي بي سي"))
=> (متعة 1)
"A"
=> (متعة 1 2)
"أب"
=> (متعة 1 2 3)
"اي بي سي"

تقطيع ON HY


انضم لنا هايف!
يرجى تأتي الاختراق على هاي!

من فضلك تعال للتسكع معنا #هي on irc.freenode.net!

يرجى التحدث عن ذلك على تويتر مع #هي رابطة هاشتاق!

من فضلك بلوق عن ذلك!

من فضلك لا ترشها على سياج جارك (دون أن تطلب ذلك بلطف)!

هاك!
افعل هذا:

1. إنشاء واقعي بيئة:

$ Virtualenv venv

وتفعيله:

$ . venv/bin/activate

أو استخدام Virtualenvwrapper لإنشاء وإدارة بيئتك الافتراضية:

$ mkvirtualenv hy
$ العمل هاي

2. احصل على الكود المصدري:

استنساخ $ git https://github.com/hylang/hy.git

أو استخدم شوكتك:

استنساخ $ git [البريد الإلكتروني محمي]: /hy.git

3. التثبيت للقرصنة:

$ مؤتمر نزع السلاح هي /
تثبيت النقطة $ -e .

4. تثبيت متطلبات التطوير الأخرى:

$ تثبيت النقطة -r المتطلبات-dev.txt

5. افعل أشياء رائعة؛ اجعل شخصًا يصرخ فرحًا/اشمئزازًا مما فعلته.

اختبار!
الاختبارات موجودة في اختبارات /. نحن نستخدم أنف.

لإجراء الاختبارات:

$ الأنف

كتابة الاختبارات --- الاختبارات جيدة!

ومن الجيد أيضًا إجراء الاختبارات لجميع الأنظمة الأساسية المدعومة والمتوافقة مع PEP 8
شفرة. يمكنك القيام بذلك عن طريق تشغيل tox:

$ توكس

وثيقة!
التوثيق موجود في المستندات /. نحن نستخدم أبو الهول.

لإنشاء المستندات بتنسيق HTML:

$ مستندات القرص المضغوط
$ جعل HTML

كتابة المستندات --- المستندات جيدة! حتى هذه الوثيقة!

المساهمة
المساهمات هي موضع ترحيب وتقدير كبير، كل القليل يساعد في جعل Hy أكثر
رائع.

طلبات السحب رائعة! نحن نحبهم؛ هنا دليل سريع:

· تفرع الريبو وإنشاء فرع الموضوع لميزة/الإصلاح. تجنب إجراء التغييرات مباشرة
على الفرع الرئيسي.

· ينبغي أن تكون جميع الميزات الواردة مصحوبة بالاختبارات.

· قبل إرسال طلب العلاقات العامة، يرجى إجراء الاختبارات والتحقق من الكود الخاص بك مقابل النمط
مرشد. يمكنك القيام بكلا الأمرين في وقت واحد:

$ جعل د

· قم بتحويل الالتزامات إلى وحدات منطقية، بحيث يسهل تتبعها والتنقل فيها لاحقًا. قبل
عند تقديم العلاقات العامة، حاول سحق الالتزامات في مجموعات التغييرات التي يسهل الرجوع إليها
لاحقاً. تأكد أيضًا من عدم ترك مسافات بيضاء زائفة في مجموعات التغييرات؛ هذا
يتجنب إنشاء مسافة بيضاء يتم إصلاحها لاحقًا.

· فيما يتعلق برسائل الالتزام، حاول الالتزام بما يلي:

· حاول الالتزام بعدد الأحرف المسموح به وهو 50 حرفًا للسطر الأول من رسائل التزام Git.

· لمزيد من التفاصيل/التوضيحات، تابع ذلك بسطر فارغ ثم تابع
وصف الالتزام بالتفصيل.

· وأخيرًا، أضف نفسك إلى ملف المؤلفين (كالتزام منفصل): أنت تستحق ذلك :)

· يجب الموافقة على جميع التغييرات الواردة من قبل عضوين مختلفين من فريق Hylang الأساسي.
من الواضح أننا نرحب بالمراجعة الإضافية، ولكننا نحتاج إلى توقيعين على الأقل لأي منها
تغيير.

· إذا كان أحد الأعضاء الأساسيين يرسل رسالة عامة، فيرجى العثور على عضوين أساسيين لا يتضمنان
مقدم العلاقات العامة. الفكرة هنا هي أنه يمكن للمرء العمل مع مؤلف العلاقات العامة، بينما يمكن للآخر العمل مع كاتب العلاقات العامة
مجموعة التغيير بأكملها.

· بالنسبة للتوثيق والتغييرات التافهة الأخرى، من الجيد دمجها بعد ACK واحد. لدينا
تغطية منخفضة، لذلك سيكون من الرائع إبقاء هذا الحاجز منخفضًا.

جوهر فريقنا
يتكون فريق التطوير الأساسي لـ Hy من المطورين التاليين:

· جوليان Danjou

· مورتن ليندرود

· J كينيث ملك

· جيرجيلي ناجى

· تووكا تورتو

· كارين روستاد

· ابهيشيك L

· كريستوفر ألان ويبر

· كونراد هينسن

· سوف كان جرين

· بول تاجليامونتي

· نيكولا داندريمونت

· بوب تولبرت

· Berker بيكساج

· كلينتون N. دريسباخ

· هو semaj

استخدم hy عبر الإنترنت باستخدام خدمات onworks.net


خوادم ومحطات عمل مجانية

قم بتنزيل تطبيقات Windows و Linux

  • 1
    NSIS: نظام التثبيت Nullsoft Scriptable
    NSIS: نظام التثبيت Nullsoft Scriptable
    NSIS (تثبيت Nullsoft Scriptable
    System) هو مصدر احترافي مفتوح
    نظام لإنشاء مثبتات Windows. هو - هي
    تم تصميمه ليكون صغيرًا ومرنًا
    ممكن ...
    تنزيل NSIS: Nullsoft Scriptable Install System
  • 2
    أوث باس
    أوث باس
    AuthPass هي كلمة مرور مفتوحة المصدر
    مدير مع دعم الشعبية و
    Keepass مثبت (kdbx 3.x و kdbx 4.x ...
    تنزيل authpass
  • 3
    Zabbix
    Zabbix
    Zabbix هو مفتوح من فئة المؤسسات
    حل المراقبة الموزعة المصدر
    مصممة للرصد والتتبع
    الأداء وتوافر الشبكة
    الخوادم والجهاز ...
    تحميل Zabbix
  • 4
    KDiff3
    KDiff3
    لم يعد هذا المستودع محفوظًا
    ويتم الاحتفاظ بها لأغراض الأرشفة. نرى
    https://invent.kde.org/sdk/kdiff3 for
    أحدث كود و
    https://download.kde.o...
    تنزيل KDiff3
  • 5
    USBLoaderGX
    USBLoaderGX
    USBLoaderGX هو واجهة مستخدم رسومية لـ
    محمل USB من Waninkoko ، استنادًا إلى
    libwiigui. يسمح بإدراج و
    إطلاق ألعاب Wii وألعاب Gamecube و
    البيرة على Wii و WiiU ...
    قم بتنزيل USBLoaderGX
  • 6
    فايربيرد
    فايربيرد
    يوفر Firebird RDBMS ميزات ANSI SQL
    & يعمل على Linux و Windows و
    العديد من منصات Unix. سمات
    التزامن الممتاز والأداء
    & قوة...
    تنزيل Firebird
  • أكثر "

أوامر لينكس

Ad