انگلیسیفرانسویاسپانیایی

Ad


فاویکون OnWorks

hy - آنلاین در ابر

Hy را در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا کنید.

این دستور hy است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


اسناد hy - hy [تصویر: Hy] [تصویر]

امتحان Hy https://try-hy.appspot.com

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

منبع https://github.com/hylang/hy

فهرست هیلانگ-بحث

IRC #هی در Freenode

ساختن وضعیت
تراویس CI.UNINDENT

Hy یک گویش فوق العاده از Lisp است که در پایتون تعبیه شده است.

از آنجایی که Hy کد Lisp خود را به درخت نحو انتزاعی Python تبدیل می کند، شما این کار را انجام داده اید
تمام دنیای زیبای پایتون در دسترس شماست، به شکل Lisp!

فهرست:

شروع سریع


[تصویر: نوازش های کارن روستارد] [تصویر]

(با تشکر از کارن روستاد برای نوازش!)

چگونه به شو HY REAL FAST:

1 ایجاد یک مجازی پــایتــون محیط.

2. محیط مجازی پایتون خود را فعال کنید.

3. نصب hy از جانب PyPI با شکستن نصب hy.

4. یک REPL را با hy.

5. موارد را در REPL تایپ کنید:

=> (چاپ "Hy!")
هی!
=> (defn salutationsnm [name] (چاپ (+ "Hy" name "!")))
=> (سلاماتnm "نام شما")
Hy Your Name!

و غیره

6. وقتی کارتان تمام شد، CTRL-D را بزنید.

OMG! که شگفت انگیز! I می خواهم به نوشتن a Hy برنامه است.

7. یک ویرایشگر برنامه نویسی نخبه باز کنید و تایپ کنید:

(چاپ "من می خواستم در دستور Python کدنویسی کنم، اما سپس Hy را دریافت کردم.")

8. ذخیره به عنوان عالیه.هی.

9. و اولین برنامه Hy خود را اجرا کنید:

عالیه.هی

10.
یک نفس عمیق بکشید تا تهویه بیش از حد نداشته باشید.

11.
با شرارت لبخند بزن و یواشکی به پناهگاهت برو و کارهای ناگفتنی انجام بده.

آموزش


به آموزش Hy خوش آمدید!

به طور خلاصه، Hy یک گویش Lisp است، اما لهجه ای که ساختار آن را به پایتون تبدیل می کند.
به معنای واقعی کلمه تبدیل به درخت نحو انتزاعی پایتون! (یا آن را در حالت خام تر قرار دهیم
اصطلاحات، Hy در پایتون استیک است!)

این بسیار جالب است زیرا به این معنی است که Hy چندین چیز است:

· Lisp که بسیار پایتونیک به نظر می رسد

· برای Lispers، یک راه عالی برای استفاده از قدرت های دیوانه کننده Lisp اما در دنیای گسترده Python
کتابخانه ها (چرا بله، اکنون می توانید یک برنامه جنگو در Lisp بنویسید!)

· برای Pythonistas، یک راه عالی برای شروع کاوش Lisp، از راحتی پایتون!

· برای همه: زبانی دلنشین که ایده های شسته رفته زیادی دارد!

اساسی مقدمه به شلی زبان برای Pythonistas
خوب، شاید قبلاً از Lisp استفاده نکرده اید، اما از پایتون استفاده کرده اید!

برنامه "سلام جهان" در Hy در واقع بسیار ساده است. بیایید آن را امتحان کنیم:

(چاپ "سلام دنیا")

دیدن؟ آسان! همانطور که ممکن است حدس بزنید، این همان نسخه پایتون است:

چاپ "سلام دنیا"

برای جمع کردن تعدادی ریاضی فوق العاده ساده، می توانیم انجام دهیم:

(+ 1 3)

که 4 را برمی گرداند و معادل:

1 + 3

چیزی که متوجه خواهید شد این است که اولین مورد در لیست تابع فراخوانی شده و
بقیه آرگومان ها آرگومان هایی هستند که وارد می شوند. در واقع، در Hy (مانند اکثر آرگومان ها
Lisps) می توانیم چندین آرگومان را به عملگر plus ارسال کنیم:

(+ 1 3 55)

که 59 را برمی گرداند.

شاید قبلاً نام Lisp را شنیده باشید اما چیز زیادی در مورد آن نمی دانید. لیسپ به سختی شما نیست
ممکن است فکر کند، و Hy از پایتون به ارث برده است، بنابراین Hy یک راه عالی برای شروع یادگیری Lisp است.
نکته اصلی که در مورد Lisp واضح است این است که پرانتزهای زیادی وجود دارد. این ممکن است
در ابتدا گیج کننده به نظر می رسد، اما آنقدرها هم سخت نیست. بیایید به چند ریاضی ساده نگاه کنیم
در یک دسته پرانتز پیچیده شده است که می توانیم در مفسر Hy وارد کنیم:

(نتیجه 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)

همانطور که احتمالا حدس زدید، این آخرین عبارت با setv به معنای اختصاص دادن متغیر است
"نتیجه" به 38.

دیدن؟ خیلی سخت نیست!

این فرض اصلی Lisp است. Lisp مخفف "پردازش لیست" است. این بدان معنی است که
ساختار برنامه در واقع لیستی از لیست هاست. (اگر با پایتون آشنایی دارید
در فهرست‌ها، کل ساختار مشابه بالا را تصور کنید، اما در عوض، هر کدام را با براکت‌های مربع در نظر بگیرید
شما می توانید ساختار بالا را هم به عنوان یک برنامه و هم به عنوان یک ساختار داده ببینید.) این است
با مثال های بیشتر قابل درک است، بنابراین بیایید یک برنامه ساده پایتون بنویسیم، آن را آزمایش کنیم،
و سپس برنامه معادل Hy را نشان دهید:

def simple_conversation():
چاپ "سلام! من می خواهم با شما آشنا شوم. از خودتان بگویید!"
name = raw_input ("اسم شما چیست؟")
سن = raw_input ("سن شما چند است؟")
چاپ "سلام " + نام + "! می بینم " + سن + " ساله هستید.

simple_conversation()

اگر این برنامه را اجرا کنیم، ممکن است به صورت زیر باشد:

سلام! من دوست دارم بشناسمت. در مورد خودتان به من بگویید!
اسم شما چیست؟ گری
سن شما چند است؟ 38
سلام گری! دیدم 38 سالته

حالا بیایید به برنامه معادل Hy نگاه کنیم:

(مکالمه ساده را تعریف کنید []
(چاپ "سلام! من می خواهم با شما آشنا شوم. درباره خودتان بگویید!")
(نام setv (ورودی خام "نام شما چیست؟"))
(سنت setv (ورودی خام "سن شما چند است؟"))
(چاپ (+ "سلام" نام "! می بینم که هستی"
سن "سال")))

(مکالمه ساده)

اگر به برنامه بالا نگاه کنید، به شرطی که به یاد داشته باشید که اولین عنصر در هر یک
لیست برنامه تابعی است (یا ماکرو... بعداً به آن‌ها خواهیم رسید).
و اینکه بقیه استدلال‌ها هستند، فهمیدن اینکه همه اینها به چه معناست، بسیار آسان است.
(همانطور که احتمالاً حدس زده اید، تعریف کنید روش Hy برای تعریف روش ها است.)

با این حال، بسیاری از مردم در ابتدا این را گیج کننده می دانند زیرا پرانتزهای زیادی وجود دارد،
اما چیزهای زیادی وجود دارد که می‌تواند به آسان‌تر کردن این کار کمک کند: حفظ تورفتگی خوب و
از یک ویرایشگر با تطبیق پرانتز استفاده کنید (این به شما کمک می کند تا بفهمید که هر کدام چیست
پرانتز جفت می شود) و همه چیز راحت می شود.

داشتن یک ساختار کد که در واقع یک داده بسیار ساده است، مزایایی دارد
ساختار به عنوان هسته Lisp بر اساس است. برای یک چیز، به این معنی است که برنامه های شما هستند
تجزیه آسان است و کل ساختار واقعی برنامه به وضوح آشکار می شود
برای تو. (یک مرحله اضافی در hy وجود دارد که در آن ساختاری که می بینید به پایتون تبدیل می شود
بازنمودهای خود ... در Lisps های «خالص تر» مانند Common Lisp یا Emacs Lisp، داده ها
ساختاری که در کد می بینید و ساختار داده ای که اجرا می شود بسیار بیشتر است
به معنای واقعی کلمه نزدیک است.)

مفهوم دیگر این ماکروها هستند: اگر ساختار برنامه یک داده ساده باشد
ساختار، به این معنی که شما می توانید کدی بنویسید که می تواند به راحتی کد بنویسد، به این معنی
پیاده سازی ویژگی های زبان کاملاً جدید می تواند بسیار سریع باشد. قبل از Hy، این نبود
برای برنامه نویسان پایتون بسیار امکان پذیر است ... اکنون شما نیز می توانید از ماکروهای باورنکردنی استفاده کنید
قدرت (فقط مراقب باشید که آنها را به سمت پا هدف نگیرید)!

Hy is a با طعم لبو پــایتــون
Hy به درخت نحو انتزاعی پایتون تبدیل می شود، بنابراین شما به زودی شروع به پیدا کردن آن خواهید کرد
قدرت آشنای پایتون در دستان شماست.

شما به انواع داده های پایتون و کتابخانه استاندارد در Hy دسترسی کامل دارید. بیایید آزمایش کنیم
با این در مترجم hy:

=> [1 2 3]
[1، 2، 3]
=> {"سگ" "پارس"
... "گربه" "میو"}
...
{'سگ': 'پارس'، 'گربه': 'میو'}
=> (, 1 2 3)
(1، 2، 3)

اگر با Lisps های دیگر آشنا هستید، ممکن است برایتان جالب باشد که Hy از Common پشتیبانی می کند
روش لیسپ نقل قول:

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

شما همچنین به همه روش های خوب انواع داخلی دسترسی دارید:

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

این چیه؟ بله در واقع، این دقیقاً مشابه است:

"fooooo".strip()

درست است --- لیسپ با علامت نقطه! اگر این رشته را به عنوان یک متغیر اختصاص دهیم، ما
همچنین می تواند کارهای زیر را انجام دهد:

(تنظیم این رشته "fooooo")
(this-string.strip)

در مورد شرط ها چطور؟:

(اگر (چیزی را امتحان کنید)
(چاپ "اگر درست است")
(این را اگر نادرست است چاپ کنید))

همانطور که در بالا می توانید بگویید، اولین استدلال برای if آزمون حقیقت است، استدلال دوم است
بدن اگر درست باشد، و آرگومان سوم (اختیاری!) اگر نادرست باشد (یعنی. دیگر).

اگر نیاز به انجام شرط های پیچیده تری داشته باشید، متوجه خواهید شد که ندارید الیف
موجود در Hy. در عوض، باید از چیزی به نام استفاده کنید مخلوط. در پایتون، ممکن است این کار را انجام دهید
چیزی مثل:

Somevar = 33
اگر مقداری > 50:
چاپ "این متغیر خیلی بزرگ است!"
elif Somevar < 10:
چاپ "این متغیر خیلی کوچک است!"
دیگری:
چاپ "این متغیر فقط درست است!"

در Hy، شما انجام می دهید:

(شرط
[(> somevar 50)
(چاپ "این متغیر خیلی بزرگ است!")]
[(< somevar 10)
(چاپ "این متغیر خیلی کوچک است!")]
[درست است، واقعی
(چاپ "That متغیر justsssst right!")])

چیزی که متوجه خواهید شد این است که مخلوط بین دستورهایی که اجرا می شود و
صحت یا نادرست بودن را به صورت مشروط بررسی کرد و سپس کمی کد را اجرا کرد اگر برگشت
درست باشد شما همچنین متوجه خواهید شد که دیگر در پایان به سادگی توسط
بررسی برای درست -- به این دلیل است درست همیشه صادق خواهد بود، بنابراین اگر تا اینجا پیش برویم، خواهیم کرد
همیشه آن یکی را اجرا کن!

ممکن است در بالا متوجه شوید که اگر کدهایی مانند:

(در صورت وجود شرایط
(بدن اگر درست باشد)
(بدن-اگر نادرست))

اما صبر کن! اگر بخواهید بیش از یک دستور را در بدنه یکی از آنها اجرا کنید چه می شود
اینها؟

می توانید کارهای زیر را انجام دهید:

(اگر (چیزی را امتحان کنید)
(انجام دادن
(چاپ "اگر درست است")
(چاپ "و چرا که نه، بیایید در مورد اینکه چقدر درست است صحبت کنیم!))
(چاپ "این هنوز هم فقط نادرست است"))

می بینید که ما استفاده کردیم do برای قرار دادن چند عبارت اگر با موارد دیگر آشنا هستید
لیپس، این معادل است پیش بینی در جاهای دیگر

نظرات با نقطه ویرگول شروع می شوند:

(چاپ "این اجرا خواهد شد")
; (چاپ "اما این نمی شود")
(+ 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:
print f.read()

و بله، ما درک لیست داریم! در پایتون ممکن است انجام دهید:

odds_squared = [
pow (تعداد، 2)
برای تعداد در محدوده(100)
اگر عدد % 2 == 1]

در Hy، می توانید این موارد را انجام دهید:

(stv odds-squared
(فهرست-کامپ
(pow num 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=هیچکدام، keyword2=42):
... بازگشت [pos1, pos2, keyword1, keyword2]
...
>>> optional_arg (1، 2)
[1، 2، هیچ، 42]
>>> optional_arg(1، 2، 3، 4)
[1 ، 2 ، 3 ، 4]
>>> optional_arg(keyword1=1، pos2=2، pos1=3، keyword2=4)
[3 ، 2 ، 1 ، 4]

همین مورد در Hy:

=> (تعریف اختیاری-arg [pos1 pos2 & کلید واژه اختیاری1 [keyword2 42]]
... [pos1 pos2 keyword1 keyword2])
=> (اختیاری-arg 1 2)
[1 2 هیچ 42]
=> (اختیاری-arg 1 2 3 4)
[1 2 3 4]

اگر نسخه‌ای از Hy گذشته 0.10.1 را اجرا می‌کنید (مثلاً git master)، یک نسخه جدید خوب نیز وجود دارد.
نحو آرگومان کلمه کلیدی:

=> (اختیاری-arg :keyword1 1
... :pos2 2
... :pos1 3
... :keyword2 4)
[3 ، 2 ، 1 ، 4]

در غیر این صورت، شما همیشه می توانید استفاده کنید درخواست. اما چیه درخواست?

آیا با گذراندن آشنا هستید *آرگس و ** کوارگ در پایتون؟:

>>> ارگ = [1 2]
>>> kwargs = {"keyword2": 3
... "keyword1": 4}
>>> optional_arg (*args، **kwargs)

ما می توانیم این را با درخواست:

=> (Setv args [1 2])
=> (setv kwargs {"keyword2" 3
... "keyword1" 4})
=> (اعمال ارگهای ارگ اختیاری)
[1 ، 2 ، 4 ، 3]

همچنین یک ساختار آرگومان های کلمه کلیدی به سبک فرهنگ لغت وجود دارد که به نظر می رسد:

(استایل دیگری را تعریف کنید [&کلید {"key1" "val1" "key2" "val2"}]
[key1 key2])

تفاوت در اینجا این است که از آنجایی که این یک دیکشنری است، نمی توانید به هیچ چیز خاصی تکیه کنید
دستور دادن به استدلال ها

Hy نیز پشتیبانی می کند *آرگس و ** کوارگ. در پایتون:

def some_func(foo، bar، *args، **kwargs):
واردات pprint
pprint.pprint((foo، bar، args، kwargs))

معادل Hy:

(تعریف کمی کارکرد [فوت بار و آرگ استراحت و کوارگ کوارگ]
(واردات pprint)
(pprint.pprint (, foo bar args kwargs)))

در نهایت، البته ما نیاز به کلاس داریم! در پایتون، ممکن است کلاسی مانند:

کلاس FooBar(شیء):
"" "
یک کلاس نمونه دیگر
"" "
def __init__(خود، x):
خود.x = x

def get_x(self):
"" "
کپی x ما را برگردانید
"" "
بازگشت خود.x

در Hy:

(کلاس FooBar [object]
"یک کلاس نمونه دیگر"
[[--init--
(fn [self x]
(setv self.xx)
; در حال حاضر برای --init-- مورد نیاز است زیرا __init__ به هیچکدام نیاز ندارد
; انشالله که از بین بره :)
هیچ یک)]

[get-x
(Fn [self]
"کپی ما از x را برگردانید"
خود.x)]])

شما همچنین می توانید ویژگی های سطح کلاس را انجام دهید. در پایتون:

مشتری کلاس (models.Model):
name = models.CharField(max_length=255)
آدرس = models.TextField()
notes = models.TextField()

در Hy:

(کلاس مشتری را حذف کنید [models.Model]
[[نام (models.CharField :max-length 255})]
[آدرس (models.TextField)]
[یادداشت ها (models.TextField)]])

Hy <-> پــایتــون تعامل
با وارد کردن Hy، می توانید از Hy مستقیماً از پایتون استفاده کنید!

اگر موارد زیر را در با سلام:

(تعریف سلام [نام] (چاپ "Hello from hy" نام))

سپس می توانید با وارد کردن hy قبل از وارد کردن ماژول، مستقیماً از پایتون از آن استفاده کنید. که در
پایتون:

واردات hy
سلام واردات

greetings.greet ("فو")

شما همچنین می توانید یک تابع را در پایتون (یا حتی یک کلاس!) اعلام کنید و از آن در Hy استفاده کنید!

اگر موارد زیر را در greetings.py در پایتون:

سلام و احوالپرسی (نام):
print("سلام، %s" % (نام))

می توانید از آن در Hy استفاده کنید:

(تبریک واردات)
(.سلام با سلام "فو")

برای استفاده از آرگومان های کلمه کلیدی، می توانید از in استفاده کنید greetings.py:

def greet(name, title="Sir"):
print("با سلام، %s %s" % (عنوان، نام))

(تبریک واردات)
(. با سلام "فو")
(. با سلام "فو" "دارث")
(اعمال (. greetings greet) ["Foo"] {"title" "Lord"})

که خروجی می دهد:

با سلام، آقا فو

درود، دارث فو

درود، لرد فو

نکات!
Hy همچنین دارای چیزی است که به عنوان "ماکرو نخی" شناخته می شود، یک ویژگی واقعاً منظم
کلوژور. "ماکرو رشته ای" (نوشته شده به عنوان ->) برای جلوگیری از لانه سازی عمیق استفاده می شود
اصطلاحات.

ماکرو threading هر عبارت را در آرگومان اول عبارت بعدی وارد می کند
به جای آن.

بیایید کلاسیک را در نظر بگیریم:

(حلقه (چاپ (Eval (خوانده)))

به جای نوشتن آن، می توانیم آن را به صورت زیر بنویسیم:

(-> (خواندن) (Eval) (چاپ) (حلقه))

در حال حاضر، با استفاده از python-sh، ما می توانیم نحوه ماکرو threading را نشان دهیم (به دلیل راه اندازی 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")

بسیار خواندنی تر، نه؟ از ماکرو threading استفاده کنید!

HY STYLE راهنمای


می دانید، وزیر، من در بسیاری از موارد با دامبلدور مخالفم... اما نمی توانید منکر این موضوع شوید.
سبک گرفتم...» - فینیاس نیگلوس بلک، لخت کردن کوزه گر و la سفارش of la عنقا

راهنمای سبک Hy در نظر دارد مجموعه‌ای از قوانین اساسی برای Hyve باشد (بله، جامعه Hy
به اضافه کردن Hy به همه چیز افتخار می کند) برای نوشتن کد اصطلاحی Hy. Hy بسیار مشتق شده است
از Clojure & Common Lisp، در حالی که همیشه قابلیت همکاری پایتون را حفظ می کند.

مقدمه
La تائو of Hy
عمون از راهب سر پرسید: "در مورد چه سوترای سخنرانی می کنی؟"
"نیروانا سوترا."
"نیروانا سوترا دارای چهار فضیلت است، اینطور نیست؟"
"این دارد."
عمون در حالی که فنجانی را برداشت، پرسید: این چند فضیلت دارد؟
راهب گفت: «اصلاً هیچ.
"اما مردم باستان می گفتند چنین بوده است، اینطور نیست؟" اومون گفت.
"نظرت در مورد آنچه آنها گفته اند چیست؟"
عمون فنجان را زد و پرسید: فهمیدی؟
راهب گفت: نه.
عمون گفت: «پس بهتر است به سخنرانی خود در مورد سوترا ادامه دهید.»
- کلان (koan).

موارد زیر فهرست مختصری از تصمیمات طراحی را نشان می دهد که در ساخت آن انجام شده است
هی.

شبیه یک Lisp. DTRT با آن (مثلاً خط تیره ها به زیرخط تبدیل می شوند، گوش پوش ها به سمت
تمام کلاهی).

· ما هنوز پایتون هستیم. اکثر داخلی ها 1:1 را به داخلی پایتون ترجمه می کنند.

· در همه جا از یونیکد استفاده کنید.

تصمیمات بد در پایتون 2 را تا زمانی که بتوانیم برطرف کنیم (نگاه کنید به تقسیم_واقعی).

· در صورت شک، به پایتون موکول کنید.

· اگر هنوز مطمئن نیستید، به Clojure موکول کنید.

· اگر حتی بیشتر مطمئن نیستید، به Common Lisp موکول کنید.

· به خاطر داشته باشید که ما Clojure نیستیم. ما Common Lisp نیستیم. ما هومویکون پایتون هستیم، با
بیت های اضافی که منطقی هستند

طرح & افتادن
· از فضاهای دنباله دار اجتناب کنید. آنها مک می کنند!

· تورفتگی باید 2 فاصله باشد (بدون زبانه های سخت)، به جز زمانی که با تورفتگی مطابقت دارد
خط قبلی

;; خوب (و ترجیح داده شده)
(تعریف فیب [n]
(اگر (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))

;; هنوز خوبه
(تعریف فیب [n]
(اگر (<= n 2) n (+ (فیب (- n 1)) (فیب (- n 2)))))

;; هنوز خوبه
(تعریف فیب [n]
(اگر (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))

;; هیستریک مسخره
(تعریف فیب [n]
(اگر (<= n 2)
n ;; بله، من عاشق زدن تصادفی کلید فاصله هستم
(+ (fib (- n 1)) (fib (- n 2)))))

· پرانتز باید هرگز تنها، غمگین و تنها در خط خودشان رها شوند.

;; خوب (و ترجیح داده شده)
(تعریف فیب [n]
(اگر (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))

;; هیستریک مسخره
(تعریف فیب [n]
(اگر (<= n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))
)
) ؛ گا، آن را با آتش بسوزان

· تراز عمودی اجازه بلوک

(اجازه دهید [[foo (bar)]
[qux (باز)]]
(foo qux))

· نظرات درون خطی باید دو فاصله از انتهای کد باشد. آنها باید همیشه یک
فاصله بین کاراکتر نظر و شروع نظر. همچنین سعی کنید این کار را نکنید
بدیهی است نظر دهید

;; خوب
(setv ind (dec x)) ; نمایه سازی از 0 شروع می شود

;; منطبق با سبک، اما فقط موارد بدیهی را بیان می کند
(setv ind (dec x)) ; ایندکس را روی x-1 قرار می دهد

;; بد
(setv ind (dec x))؛ تایپ کلمات برای سرگرمی

برنامه نویسی سبک
· به عنوان یک قرارداد، سعی کنید از آن استفاده نکنید دف برای هر چیزی غیر از متغیرهای سراسری؛ استفاده کنید setv
داخل توابع، حلقه ها و غیره

;; خوب (و ترجیح داده شده)
(محدود * 400000)

(تعریف فیب [ab]
(در حالی که درست است
(بازده الف)
(setv (, ab) (, b (+ ab)))))

;; بد (و ارجح نیست)
(تعریف فیب [ab]
(در حالی که درست است
(بازده الف)
(def (, ab) (, b (+ ab)))))

· در جاهایی که دستور برداری در نظر گرفته شده است از نحو s-expression استفاده نکنید. به عنوان مثال، واقعیت
اینکه اولی این دو مثال کار می کند فقط به این دلیل است که کامپایلر بیش از حد نیست
سخت گیرانه. در واقع، نحو صحیح در مکان هایی مانند این مورد دوم است.

;; بد (و بد)
(defn foo (x) (چاپ x))
(foo 1)

;; خوب (و ترجیح داده شده)
(تعریف foo [x] (چاپ x))
(foo 1)

· از ماکرو نخی یا ماکروهای دم threading هنگام مواجهه با تودرتوی عمیق استفاده کنید
عبارات s. با این حال، هنگام استفاده از آنها محتاط باشید. آیا از آنها در هنگام وضوح استفاده کنید
خوانایی بهبود می یابد. عبارات پیچیده و سخت درک را ایجاد نکنید.

;; ارجح
(تعریف *نام*
(با [f (باز کردن "names.txt")]
(-> (. خواندن f) (.strip) (. جایگزین "\"" "") (. split ",") (مرتب شده))))

;; خیلی خوب نیست
(تعریف *نام*
(با [f (باز کردن "names.txt")]
(مرتب شده (. split "، (. جایگزین "\"" "" (.strip (.خواندن f)))))))

;; احتمالا ایده خوبی نیست
(مربع تعریف؟ [x]
(->> 2 (pow (int (int (sqrt x))) (= x)))

· نماد نقطه به سبک Clojure بر فراخوانی مستقیم متد شی ترجیح داده می شود.
اگرچه هر دو همچنان پشتیبانی خواهند شد.

;; خوب
(با [fd (باز کردن/ etc / passwd")]
(چاپ (.readlines fd)))

;; خیلی خوب نیست
(با [fd (باز کردن/ etc / passwd")]
(چاپ (fd.readlines)))

نتیجه
«مدها محو می‌شوند، سبک جاودانه است» - ایو سن لوران

این راهنما فقط مجموعه‌ای از دستورالعمل‌های جامعه است و بدیهی است که دستورالعمل‌های جامعه این کار را انجام می‌دهند
بدون یک جامعه فعال معنا ندارد. مشارکت پذیرفته می شود. به ما در #hy in بپیوندید
freenode، درباره آن وبلاگ بنویسید، در مورد آن توییت کنید، و مهمتر از همه، با Hy سرگرم شوید.

با تشکر
· این راهنما به شدت از @paultag پست وبلاگ Hy بقاء راهنما

· Clojure سبک راهنما

مستندات شاخص


فهرست:

فرمان لاین رابط
hy
فرمان لاین گزینه
-c
کد Hy را در آن اجرا کنید فرمان.

$ hy -c "(چاپ (+ 2 2))"
4

-i
کد Hy را در آن اجرا کنید فرمان، سپس در REPL بمانید.

-m
کد Hy را در آن اجرا کنید واحد، از جمله تعریف کردن در صورت تعریف

La -m flag لیست گزینه ها را خاتمه می دهد تا همه آرگومان های بعد از واحد نام
به ماژول در منتقل می شوند sys.argv.

جدید در نسخه 0.10.2.

-- جاسوس قبل از اجرا کد پایتون معادل را چاپ کنید. مثلا:

=> (defn salutationsnm [name] (چاپ (+ "Hy" name "!")))
def salutationsnm(name):
بازگشت چاپ (((u'Hy ' + نام) + u'!'))
=> (سلاماتnm "نام شما")
salutationsnm (u'YourName')
Hy Your Name!
=>

جدید در نسخه 0.9.11.

--نمایش ردیابی
ردیابی های گسترده برای استثناهای Hy چاپ کنید.

جدید در نسخه 0.9.12.

-v شماره نسخه Hy را چاپ کرده و خارج شوید.

hyc
فرمان لاین گزینه
فایل[، fileN]
کد Hy را به بایت کد پایتون کامپایل کنید. برای مثال کد زیر را به عنوان ذخیره کنید
hyname.hy:

(تعریف hy-hy [نام]
(چاپ (+ "Hy" name "!")))

(hy-hy "Afroman")

سپس اجرا کنید:

$ hyc hyname.hy
$ python hyname.pyc
هی افرومن!

hy2py
جدید در نسخه 0.10.1.

فرمان لاین گزینه
-s

--با منبع
ساختار منبع تجزیه شده را نشان دهید.

-a

--with-ast
نمایش AST تولید شده.

-np

--بدون پایتون
کد پایتون تولید شده از AST را نشان ندهید.

Hy ( زبان)
هشدار:
این ناقص است. لطفاً در تلاش برای مستندسازی مشارکت کنید.

نظریه of Hy
Hy، بیش از هر چیز دیگری، سازگاری 100% را در هر دو جهت با پایتون حفظ می کند
خود همه کدهای Hy از چند قانون ساده پیروی می کنند. این را حفظ کنید، زیرا قرار است وارد شود
دستی

این قوانین کمک می کند تا اطمینان حاصل شود که کد Hy اصطلاحی و قابل رابط در هر دو زبان است.

· نمادهای موجود در گوشواره به نسخه با حروف بزرگ آن رشته ترجمه می شوند. برای
مثال، فو خواهد شد FOO.

· نهادهای UTF-8 با استفاده از کدگذاری خواهند شد کلمه و پیشوند با hy_. برای مثال،
خواهد شد hy_w7h, خواهد شد hy_g6hو i♥u خواهد شد hy_iu_t0x.

· نمادهایی که حاوی خط تیره هستند با زیرخط جایگزین می شوند. مثلا،
رندر-قالب خواهد شد render_template. این بدان معنی است که نمادهای دارای خط تیره خواهند بود
معادل های زیر خط خود را سایه بزنید و بالعکس.

توکار
Hy دارای تعدادی فرم خاص است که برای کمک به تولید صحیح Python AST استفاده می شود.
موارد زیر فرم‌های «ویژه» هستند که ممکن است رفتاری کمی غیرمنتظره داشته باشند
برخی موقعیت ها

.
جدید در نسخه 0.10.0.

. برای انجام دسترسی ویژگی بر روی اشیاء استفاده می شود. از یک DSL کوچک برای اجازه دادن به سرعت استفاده می کند
دسترسی به ویژگی ها و آیتم ها در یک ساختار داده تودرتو.

به عنوان مثال،

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

کامپایل می شود به:

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

. اولین آرگومان خود را کامپایل می کند (در مثال، فو) به عنوان شیئی که روی آن انجام می شود
عدم ارجاع صفت از نمادهای خالی به عنوان ویژگی برای دسترسی استفاده می کند (در مثال، بار,
پایگاه, خراش دادن، و محتویات لیست ها را جمع آوری می کند (در مثال، [(+ 1 2)]) برای نمایه سازی.
آرگومان های دیگر یک خطای کامپایل ایجاد می کنند.

دسترسی به ویژگی های ناشناخته یک را پرتاب می کند AttributeError. دسترسی به کلیدهای ناشناخته یک را پرتاب می کند
خطای صفحه اول (در لیست ها و تاپل ها) یا الف خطای کلیدی (در لغت نامه ها).

->
-> (یا نخ درشت دستور) برای جلوگیری از تودرتو عبارات استفاده می شود. ماکرو threading
هر عبارت را در اولین مکان آرگومان عبارت بعدی درج می کند. به شرح زیر
کد این را نشان می دهد:

=> (تعریف خروجی [ab] (چاپ ab))
=> (-> (+ 4 6) (خروجی 5))
10 5

- >>
- >> (یا نخ دم درشت دستور) شبیه به نخ درشت دستور، اما به جای
با قرار دادن هر عبارت در آرگومان اول عبارت بعدی، آن را به عنوان الحاق می کند
آخرین استدلال کد زیر این را نشان می دهد:

=> (تعریف خروجی [ab] (چاپ ab))
=> (->> (+ 4 6) (خروجی 5))
5 10

درخواست
درخواست برای اعمال فهرست اختیاری آرگومان ها و فرهنگ لغت اختیاری کوارگ ها استفاده می شود
به یک تابع

طریقه استفاده: (درخواست دادن fn-name [ارگ] [کوارگ])

مثال:

(defn thunk []
"سلام")

(اعمال thunk)
;=> "سلام"

(تعریف کل خرید [مقدار قیمت و اختیاری [کارمزد 1.05] [ مالیات بر ارزش افزوده 1.1]]
(* مبلغ قیمت مالیات بر ارزش افزوده))

(اعمال کل خرید [10 15])
;=> 173.25

(اعمال کل خرید [10 15] {"vat" 1.05})
;=> 165.375

(اعمال کل خرید [] {"قیمت" 10 "مقدار" 15 " مالیات بر ارزش افزوده" 1.05})
;=> 165.375

و
و در عبارات منطقی استفاده می شود. حداقل دو پارامتر طول می کشد. اگر تمام پارامترها
ارزیابی به درست، آخرین پارامتر برگردانده می شود. در هر صورت، اولین مقدار نادرست
بازگردانده خواهد شد. مثال استفاده:

=> (و درست نادرست)
غلط

=> (و True True)
درست

=> (و True 1)
1

=> (و درست [] نادرست درست)
[]

توجه:
و اتصال کوتاه می کند و ارزیابی پارامترها را به محض دریافت اولین اشتباه متوقف می کند
مواجه شده.

=> (و False (چاپ "سلام"))
غلط

ادعا
ادعا برای بررسی شرایط در حین اجرای برنامه استفاده می شود. اگر شرط نباشد
ملاقات کرد، یک خطای ادعا ظهور کرده. ادعا ممکن است یک یا دو پارامتر بگیرد. اولین
پارامتر شرطی است که باید بررسی شود و باید به یکی از آنها ارزیابی شود درست or غلط.
پارامتر دوم، اختیاری، یک برچسب برای عنوان است، و رشته ای است که خواهد بود
مطرح شده با خطای ادعا. مثلا:

(اظهار (= متغیر-مقدار مورد انتظار))

(اظهار غلط)
; خطای ادعا

(اظهار (= 1 2) "یک باید برابر دو باشد")
; AssertionError: یک باید برابر با دو باشد

همکار
همکار برای مرتبط کردن یک کلید با یک مقدار در فرهنگ لغت یا تنظیم فهرست فهرست استفاده می شود
به یک ارزش حداقل به سه پارامتر نیاز دارد: داده ها ساختار اصلاح شدن، الف کلید
or شاخصو ارزش. اگر بیش از سه پارامتر استفاده شود، به صورت جفت مرتبط می شود.

نمونه هایی از استفاده:

=>(اجازه دهید [[مجموعه {}]]
... (مجموعه انجمن "سگ" "بارک")
... (مجموعه چاپی))
{u'Dog': u'Bark'}

=>(اجازه دهید [[مجموعه {}]]
... (مجموعه Assoc "Dog" "Bark" "Cat" "Meow")
... (مجموعه چاپی))
{u'Cat': u'Meow', u'Dog': u'Bark'}

=>(اجازه دهید [[مجموعه [1 2 3 4]]]
... (مجموعه 2 هیچ کدام)
... (مجموعه چاپی))
[1، 2، هیچ، 4]

توجه:
همکار ساختار داده را در جای خود اصلاح می کند و برمی گرداند هیچ.

شکستن
شکستن برای بیرون آمدن از یک حلقه استفاده می شود. بلافاصله حلقه را خاتمه می دهد. به شرح زیر
مثال بی نهایت دارد در حین حلقه ای که به محض ورود کاربر خاتمه می یابد k.

(در حالی که True (اگر (= "k" (ورودی خام "؟"))
(زنگ تفريح)
(چاپ "دوباره امتحان کن")))

مخلوط
مخلوط می توان از آن برای ساخت تودرتو استفاده کرد if بیانیه. مثال زیر نشان می دهد
رابطه بین کلان و بسط آن:

(شرط [شرط-1 نتیجه-1]
[شرط-2 نتیجه-2])

(اگر شرط-1 نتیجه-1
(اگر شرط-2 نتیجه-2))

همانطور که در زیر نشان داده شده است، تنها اولین بلوک نتیجه منطبق اجرا می شود.

=> (تعریف مقدار چک [مقدار]
... (cond [(< مقدار 5) (چاپ "مقدار کوچکتر از 5 است")]
... [(= مقدار 5) (چاپ "مقدار برابر است با 5")]
... [(> مقدار 5) (چاپ "مقدار بزرگتر از 5 است")]
... [درست (چاپ "ارزش چیزی است که نباید باشد")]))

=> (بررسی مقدار 6)
مقدار بزرگتر از 5 است

ادامه دادن
ادامه دادن اجرا را به شروع یک حلقه برمی گرداند. در مثال زیر،
(عوارض جانبی 1) برای هر تکرار فراخوانی می شود. (عوارض جانبی 2)با این حال، فقط فراخوانی شده است
هر مقدار دیگر در لیست

;; با فرض اینکه (side-effect1) و (side-effect2) توابع و
;; مجموعه لیستی از مقادیر عددی است

(برای [x مجموعه]
(انجام دادن
(عوارض جانبی 1 x)
(اگر (% x 2)
(ادامه هید))
(عوارض جانبی 2 x)))

dict-comp
dict-comp برای ایجاد فرهنگ لغت استفاده می شود. سه یا چهار پارامتر طول می کشد. اولین
دو پارامتر برای کنترل مقدار برگشتی (جفت کلید-مقدار) هستند در حالی که پارامتر سوم است
برای انتخاب موارد از یک دنباله استفاده می شود. از پارامتر چهارم و اختیاری می توان استفاده کرد
برخی از موارد موجود در دنباله را بر اساس یک عبارت شرطی فیلتر کنید.

=> (dict-comp x (* x 2) [x (محدوده 10)] (فرد؟ x))
{1: 2، 3: 6، 9: 18، 5: 10، 7: 14}

do / پیش بینی
do و پیش بینی برای ارزیابی هر یک از آرگومان های آنها و برگرداندن آخرین آرگومان استفاده می شود. برگشت
مقادیر هر آرگومان دیگری به جز آخرین آرگومان کنار گذاشته می شوند. می توان از آن استفاده کرد یازدهمین حرف الفبای یونانی or
لیست-کامپ برای اجرای منطق پیچیده تر همانطور که در یکی از مثال های زیر نشان داده شده است.

چند مثال استفاده:

=> (اگر درست باشد
... (انجام دهید (چاپ "سنگ عوارض جانبی!")
... (چاپ "آره، واقعا!")))
عوارض جانبی سنگ!
آره واقعا!

;; با فرض اینکه (اثر جانبی) تابعی است که می خواهیم برای هر کدام فراخوانی کنیم
;; و هر مقدار موجود در لیست، اما ارزش بازگشتی آنها برای ما مهم نیست
=> (list-comp (do (عوارض جانبی x)
... (اگر (< x 5) (* 2 x)
... (* 4 x)))
... (x (محدوده 10)))
[0 ، 2 ، 4 ، 6 ، 8 ، 20 ، 24 ، 28 ، 32 ، 36]

do می تواند هر تعداد آرگومان، از 1 تا n را بپذیرد.

دف / setv
دف و setv برای اتصال یک مقدار، شی یا تابع به یک نماد استفاده می شود. مثلا:

=> (نام‌های تعریف شده ["آلیس" "باب" "چارلی"])
=> (چاپ نام ها)
[u'Alice', u'Bob', U'Charlie']

=> (شمارگر setv (fn [مجموعه مورد] (مورد مجموعه تعداد.)))
=> (شماره [1 2 3 4 5 2 3] 2)
2

از کلاس خارج کردن
کلاس های جدید با اعلام شده است از کلاس خارج کردن. می تواند دو پارامتر اختیاری بگیرد: یک بردار
تعریف یک کلاس فوق العاده ممکن و بردار دیگری حاوی ویژگی های جدید
کلاس به عنوان بردار دو آیتم.

(defclass class-name [super-class-1 super-class-2]
[[ارزش ویژگی]])

همانطور که در مثال زیر نشان داده شده است، هم مقادیر و هم توابع می توانند در کلاس جدید محدود شوند:

=> (از کلاس گربه []
... [[سن هیچ]
... [رنگ "سفید"]
... [صحبت (fn [self] (چاپ "میو"))]])

=> (نقطه دفاعی (گربه))
=> (setv spot.colour "Black")
"سیاه"
=> (speak spot)
میو

تعریف کنید / دفع کردن
تعریف کنید و دفع کردن ماکروها برای تعریف توابع استفاده می شوند. آنها سه پارامتر را می گیرند: نام
از تابع برای تعریف، بردار از پارامترهای، و بدن از تابع:

(تعریف نام [params] بدنه)

پارامترها ممکن است کلمات کلیدی زیر را در مقابل خود داشته باشند:

&اختیاری
پارامتر اختیاری است پارامتر را می توان به عنوان یک لیست دو موردی، که در آن
عنصر اول نام پارامتر و دومی مقدار پیش فرض است. پارامتر
می تواند به عنوان یک آیتم نیز داده شود که در این صورت مقدار پیش فرض است هیچ.

=> (تعریف ارزش کل [ارزش و اختیاری [مالیات بر ارزش افزوده 10]]
... (+ (/ (* ارزش افزوده-مالیات) 100) ارزش))

=> (مقدار کل 100)
110.0

=> (مقدار کل 100 1)
101.0

&کلید

&kwargs
پارامتر حاوی 0 یا بیشتر آرگومان کلمه کلیدی خواهد بود.

مثال‌های کد زیر تابعی را تعریف می‌کند که تمام کلمات کلیدی را چاپ می‌کند
استدلال ها و ارزش های آنها

=> (تعیین پارامترهای چاپ [&kwargs kwargs]
... (برای [(، kv) (.items kwargs)] (kv print)))

=> (اعمال پارامترهای چاپ [] {"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.

La نام مستعار و defun-alias ماکروها بسیار شبیه هستند تعریف کنید، با این تمایز که
به جای تعریف یک تابع با یک نام، اینها می توانند نام مستعار را نیز تعریف کنند. دیگر
به جای اینکه لیستی از نمادها را برای نام توابع به عنوان اولین پارامتر در نظر بگیرید، نام مستعار و
defun-alias هیچ تفاوتی با تعریف کنید و دفع کردن.

=> (defn-alias [نام مستعار اصلی] []
... (چاپ "سلام!"))
=> (نام اصلی)
"سلام!"
=> (نام مستعار)
"سلام!"

تعریف کردن
جدید در نسخه 0.10.1.

La تعریف کردن ماکرو یک تابع اصلی را تعریف می کند که بلافاصله با آن فراخوانی می شود sys.argv as
اگر و فقط اگر این فایل به عنوان یک اسکریپت اجرا شود، آرگومان می کند. به عبارت دیگر، این:

(تعریف [&rest args]
(با ارگ کاری انجام دهید))

معادل است با:

def main(*args):
do_something_with (args)
بازگشت 0

اگر __name__ == "__اصلی__":
واردات سیستم
retval = main(*sys.arg)

if isinstance (retval, int):
sys.exit(retval)

توجه داشته باشید که همانطور که در بالا مشاهده می کنید، اگر یک عدد صحیح از این تابع برگردانید، این خواهد بود
به عنوان وضعیت خروج برای اسکریپت شما استفاده می شود. (در غیر این صورت پایتون از وضعیت 0 خارج می شود،
یعنی همه چیز اوکی است!)

(از آنجا که (sys.exit 0) در مورد بازگشت غیر صحیح از به صراحت اجرا نمی شود
تعریف کردن، قرار دادن ایده خوبی است (تعریف کردن) به عنوان آخرین قطعه کد در فایل شما.)

defmacro
defmacro برای تعریف ماکروها استفاده می شود. قالب کلی است (defmacro نام [مولفه های]
expr).

مثال زیر یک ماکرو را تعریف می کند که می تواند برای جابجایی ترتیب عناصر در کد استفاده شود.
به کاربر این امکان را می دهد که کد را در نماد infix بنویسد، جایی که اپراتور بین آن قرار دارد
عملوندها

=> (infix defmacro [کد]
... (شبه نقل قول
... (بدون نقل قول (دریافت کد 1))
... (بدون نقل قول (دریافت کد 0))
... (بدون نقل قول (دریافت کد 2)))))

=> (پسوند (1 + 1))
2

نام مستعار defmacro
نام مستعار defmacro برای تعریف ماکروها با چندین نام (نام مستعار) استفاده می شود. قالب کلی
is (مستعار defmacro [نام] [مولفه های] expr). چندین ماکرو را با یکسان ایجاد می کند
لیست پارامترها و بدنه، در زیر لیست مشخص شده از نام ها.

مثال زیر دو ماکرو را تعریف می‌کند که هر دو به کاربر اجازه می‌دهند کد را در آن بنویسد
نماد infix

=> (مستعار defmacro [infix infi] [کد]
... (شبه نقل قول
... (بدون نقل قول (دریافت کد 1))
... (بدون نقل قول (دریافت کد 0))
... (بدون نقل قول (دریافت کد 2)))))

=> (پسوند (1 + 1))
2
=> (infi (1 + 1))
2

defmacro/g!
جدید در نسخه 0.9.12.

defmacro/g! نسخه ویژه ای از defmacro که برای تولید خودکار استفاده می شود gensym
برای هر نمادی که با آن شروع می شود g!.

به عنوان مثال، GA تبدیل خواهد شد ( gensym "آ").

ببینید منبع:
بخش using-gensym

مرده زدا
جدید در نسخه 0.9.12.

مرده زدا یک ماکرو خواننده را تعریف می کند، که به شما امکان می دهد ساختار نحوی را بازسازی یا تغییر دهید.

=> (دفریدر ^ [expr] (print expr))
=> #^(1 2 3 4)
(1)
=> #^"سلام"
"سلام"

ببینید منبع:
بخش خوان ماکرو

از
جدید در نسخه 0.9.12.

از یک شی را از فضای نام فعلی حذف می کند.

=> (setv foo 42)
=> (دل فو)
=> فو
ردیابی (آخرین تماس اخیر):
فایل " "، خط 1، در
NameError: نام "foo" تعریف نشده است

از همچنین می تواند اشیاء را از نقشه ها، لیست ها و موارد دیگر حذف کند.

=> (تست setv (لیست (محدوده 10)))
=> تست
[0 ، 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9]
=> (del (تست برش 2 4)) ;; موارد را از 2 تا 4 حذف کنید
=> تست
[0، 1، 4، 5، 6، 7، 8، 9]
=> (Setv dic {"foo" "bar"})
=> دیسک
{"foo": "bar"}
=> (del (دریافت دیسک "foo"))
=> دیسک
{}

به
جدید در نسخه 0.10.1.

به برای ساده کردن دنباله ای از فراخوانی های متد به یک شی استفاده می شود.

=> (doto [] (.append 1) (.append 2) .reverse)
[2 1]

=> (مجموعه setv [])
=> (.append مجموعه 1)
=> (.append مجموعه 2)
=> (مجموعه معکوس)
=> مجموعه
[2 1]

ارزیابی
ارزیابی یک عبارت نقل قول را ارزیابی می کند و مقدار را برمی گرداند.

=> (eval '(چاپ "Hello World"))
"سلام دنیا"

ارزیابی و کامپایل
eval-when-compile
اول / ماشین
اول و ماشین ماکروهایی برای دسترسی به اولین عنصر مجموعه هستند:

=> (اول (محدوده 10))
0

برای
برای برای فراخوانی یک تابع برای هر عنصر در یک لیست یا بردار استفاده می شود. نتایج هر کدام
تماس حذف شده و برای بیان برمی گردد هیچ بجای. کد مثال تکرار می شود
روی مجموعه و برای هر کدام عنصر in مجموعه تماس بگیرید اثر جانبی عملکرد با
عنصر به عنوان استدلال آن:

;; با فرض اینکه (اثر جانبی) تابعی است که یک پارامتر واحد را می گیرد
(برای [مجموعه عنصر] (عنصر اثر جانبی))

;; for can یک بلوک اختیاری else داشته باشد
(برای [مجموعه عنصر] (عنصر اثر جانبی)
(دیگر (عوارض جانبی-2)))

اختیاری دیگر بلوک فقط در صورتی اجرا می شود که برای حلقه به طور معمول خاتمه می یابد. اگر
اعدام متوقف شده است شکستناز دیگر بلوک اجرا نمی شود

=> (برای [عنصر [1 2 3]] (اگر (< عنصر 3)
... (عنصر چاپی)
... (زنگ تفريح))
... (دیگر (چاپ "حلقه تمام شد")))
1
2

=> (برای [عنصر [1 2 3]] (اگر (< عنصر 4)
... (عنصر چاپی)
... (زنگ تفريح))
... (دیگر (چاپ "حلقه تمام شد")))
1
2
3
حلقه تمام شد

genexpr
genexpr برای ایجاد عبارات مولد استفاده می شود. دو یا سه پارامتر طول می کشد. در
پارامتر اول عبارتی است که مقدار بازگشتی را کنترل می کند، در حالی که پارامتر دوم استفاده می شود
برای انتخاب موارد از یک لیست از پارامتر سوم و اختیاری می توان برای فیلتر کردن استفاده کرد
برخی از موارد موجود در لیست بر اساس یک عبارت شرطی. genexpr مشابه است
لیست-کامپ، با این تفاوت که یک تکراری را برمی گرداند که مقادیر را به جای یک به یک ارزیابی می کند
بلافاصله آنها را ارزیابی می کند.

=> (مجموعه تعریف (محدوده 10))
=> (دف فیلتر شده (genexpr x [x مجموعه] (حتی؟ x)))
=> (لیست فیلتر شده)
[0 ، 2 ، 4 ، 6 ، 8]

gensym
جدید در نسخه 0.9.12.

gensym برای تولید یک نماد منحصر به فرد استفاده می شود که اجازه می دهد ماکروها بدون آن نوشته شوند
تصادفی نام متغیر با هم برخورد می کند.

=> (gensym)
u':G_1235'

=> (همنام "x")
u':x_1236'

ببینید منبع:
بخش using-gensym

دریافت کنید
دریافت کنید برای دسترسی به عناصر منفرد در لیست ها و فرهنگ لغت استفاده می شود. دریافت کنید دو پارامتر می گیرد:
la داده ها ساختار و شاخص or کلید از مورد سپس مورد مربوطه را برمی گرداند
مقدار از فرهنگ لغت یا لیست. مثال استفاده:

=> (اجازه دهید [[حیوانات {"سگ" "پارس کنند" "گربه" "میو"}]
... [اعداد ["صفر" "یک" "دو" "سه"]]]
... (چاپ (به دست آوردن حیوانات "سگ"))
... (چاپ (اعداد 2 را دریافت کنید)))
پوست درخت
دو

توجه:
دریافت کنید اگر از فرهنگ لغت برای کلیدی که وجود ندارد پرس و جو شود، یک KeyError ایجاد می کند.

توجه:
دریافت کنید اگر فهرست یا چند تا برای شاخصی که خارج از آن است پرس و جو شود IndexError ایجاد می کند.
مرزها

جهانی
جهانی می توان برای علامت گذاری یک نماد به عنوان جهانی استفاده کرد. این به برنامه نویس اجازه می دهد تا a را اختصاص دهد
ارزش برای یک نماد جهانی خواندن یک نماد جهانی نیازی به این ندارد جهانی کلمه کلیدی --
فقط اختصاص دادن آن را انجام می دهد.

مثال زیر نشان می دهد که چگونه نماد جهانی است a یک مقدار در یک تابع و
بعداً در عملکرد دیگری چاپ می شود. بدون جهانی کلمه کلیدی، تابع دوم
یک پرتاب می کرد NameError.

(تعریف یک [مقدار]
(جهانی الف)
(مقدار تعیین کنید))

(defn print-a []
(چاپ الف))

(مجموعه a 5)
(چاپ-الف)

if / اگر نه
جدید در نسخه 0.10.0: اگر نه

if برای انتخاب مشروط کد برای اجرا استفاده می شود. باید دارای یک شرط باشد
بلوک و بلوکی که در صورت ارزیابی بلوک شرط اجرا می شود درست. به صورت اختیاری،
ممکن است حاوی یک بلوک نهایی باشد که در صورت انجام ارزیابی شرط اجرا می شود
غلط.

اگر نه مشابه است، اما بلوک دوم زمانی اجرا می شود که شرط در حالی که از کار بیفتد
سومین و آخرین بلوک زمانی اجرا می شود که تست موفقیت آمیز باشد -- ترتیب مخالف if.

کاربرد مثال:

(اگر (پول مانده؟ حساب)
(چاپ "بریم خرید")
(چاپ "بریم و کار کنیم"))

(اگر نه (پول مانده؟ حساب)
(چاپ "بریم و کار کنیم")
(چاپ "بریم خرید"))

صداقت پایتون محترم است. هیچ, غلط، صفر از هر نوع عددی، یک دنباله خالی،
و یک فرهنگ لغت خالی در نظر گرفته شده است غلط; هر چیز دیگری در نظر گرفته شده است درست.

lisp-if / بلند کردن و لیسپ-اگر نه / lif-not
جدید در نسخه 0.10.0.

جدید در نسخه 0.10.2: lisp-if-not / lif-not

برای کسانی که Lispy بیشتری را ترجیح می دهند if بند، ما داریم lisp-if، یا بلند کردن. این فقط در نظر می گیرد
هیچ / صفر دروغ گفتن تمام مقادیر دیگر Python "false-ish" درست در نظر گرفته می شوند.
برعکس، داریم لیسپ-اگر نه و lif-not به موازات if و اگر نه که معکوس می کند
مقایسه.

=> (lisp-if True "true" "false")
"درست است، واقعی"
=> (lisp-if False "true" "false")
"درست است، واقعی"
=> (lisp-if 0 "true" "false")
"درست است، واقعی"
=> (lisp-اگر صفر "درست" "نادرست")
"کاذب"
=> (lisp-if None "true" "false")
"کاذب"
=> (lisp-if-not nil "true" "false")
"درست است، واقعی"
=> (lisp-if-not None "true" "false")
"درست است، واقعی"
=> (lisp-if-not False "true" "false")
"کاذب"

; معادل اما کوتاه تر
=> (lif True "درست" "نادرست")
"درست است، واقعی"
=> (اگر هیچ "درست" "نادرست")
"کاذب"
=> (lif-not None "true" "false")
"درست است، واقعی"

واردات
واردات مانند پایتون برای وارد کردن ماژول ها استفاده می شود. چندین راه وجود دارد که واردات می توان
استفاده شود

;; هر یک از این ماژول ها را وارد می کند
;;
;; پایتون:
;; سیستم واردات
;; os.path را وارد کنید
(وارد کردن sys os.path)

;; واردات از یک ماژول
;;
;; Python: از os.path import وجود دارد، isdir، isfile
(وارد کردن [os.path [isdir isfile]])

;; واردات با نام مستعار
;;
;; پایتون: سیستم را به عنوان سیستم وارد کنید
(وارد کردن [sys :as systest])

;; شما می توانید به تعداد دلخواه واردات از انواع مختلف فهرست کنید.
(وارد کردن [tests.resources [kwtest function-with-a-dash]]
[os.path [isdir isfile]]
[sys :as systest])

;; تمام توابع ماژول را به فضای نام فعلی وارد کنید
(وارد کردن [sys [*]])

یازدهمین حرف الفبای یونانی / fn
یازدهمین حرف الفبای یونانی و fn می توان برای تعریف یک تابع ناشناس استفاده کرد. پارامترها مشابه هستند
تعریف کنید: پارامتر اول بردار پارامترها و بقیه بدنه پارامتر است
تابع. یازدهمین حرف الفبای یونانی یک تابع جدید برمی گرداند. در مثال زیر، یک تابع ناشناس
تعریف شده و به تابع دیگری برای فیلتر کردن خروجی منتقل می شود.

=> (افرادی [{:name "Alice" :age 20}
... {:name "Bob" :age 25}
... {:name "Charlie" :age 50}
... {:name "Dave" :age 5}])

=> (تعریف نمایش افراد [فیلتر افراد]
... (برای [فرد افراد] (اگر (فرد فیلتر) (چاپ (:نام شخص)))))

=> (نمایش افراد (فرد [فرد] (< (: فرد سنی) 25)))
آلیس
دیو

همانطور که در تعاریف تابع عادی، اگر اولین عنصر بدن یک رشته باشد، آن را
به عنوان یک رشته مستند عمل می کند. این برای دادن رشته های مستند به متدهای کلاس مفید است.

=> (stv-time-XNUMX
... (fn [x]
... "ورودی را در سه ضرب می کند و نتیجه را برمی گرداند."
... (* x 3)))

این را می توان از طریق داخلی پایتون تأیید کرد کمک عملکرد:

=> (زمان کمک - سه)
راهنمایی در مورد تابع times_three:

times_three (x)
ورودی را در سه ضرب می کند و نتیجه را برمی گرداند
(پایان)

آخر
جدید در نسخه 0.10.2.

آخر می توان برای دسترسی به آخرین عنصر یک مجموعه استفاده کرد:

=> (آخرین [2 4 6])
6

اجازه
اجازه برای ایجاد متغیرهای دارای دامنه واژگانی استفاده می شود. آنها در ابتدای ایجاد می شوند
اجازه شکل می گیرد و پس از فرم وجود ندارد. مثال زیر این موضوع را نشان می دهد
رفتار - اخلاق:

=> (بگذارید [[x 5]] (چاپ x)
... (اجازه دهید [[x 6]] (چاپ x))
... (چاپ x))
5
6
5

La اجازه ماکرو دو پارامتر دارد: یک تعریف برداری متغیرها و بدن که می شود
اجرا شده. متغیرها بردار است که در آن هر عنصر یا یک متغیر منفرد یا یک بردار است
تعریف یک جفت مقدار متغیر در مورد یک متغیر، مقداری به آن اختصاص داده می شود
هیچ; در غیر این صورت از مقدار عرضه شده استفاده می شود.

=> (بگذارید [x [y 5]] (چاپ xy))
هیچ 5

لیست-کامپ
لیست-کامپ درک لیست را انجام می دهد. دو یا سه پارامتر طول می کشد. اولین
پارامتر عبارتی است که مقدار بازگشتی را کنترل می کند، در حالی که دومی برای آن استفاده می شود
موارد را از یک لیست انتخاب کنید از پارامتر سوم و اختیاری می توان برای فیلتر کردن برخی استفاده کرد
از موارد موجود در لیست بر اساس یک عبارت شرطی. چند نمونه:

=> (مجموعه تعریف (محدوده 10))
=> (list-comp x [x مجموعه])
[0 ، 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9]

=> (list-comp (* x 2) [x مجموعه])
[0 ، 2 ، 4 ، 6 ، 8 ، 10 ، 12 ، 14 ، 16 ، 18]

=> (list-comp (* x 2) [x مجموعه] (< x 5))
[0 ، 2 ، 4 ، 6 ، 8]

نه
نه در عبارات منطقی استفاده می شود. این یک پارامتر واحد را می گیرد و یک معکوس برمی گرداند
ارزش حقیقت اگر درست به عنوان پارامتر داده می شود، غلط بازگردانده خواهد شد و بالعکس
کاربرد مثال:

=> (درست نیست)
غلط

=> (نادرست نیست)
درست

=> (نه هیچکدام)
درست

or
or در عبارات منطقی استفاده می شود. حداقل دو پارامتر طول می کشد. آن را برمی گرداند
اولین پارامتر غیر نادرست اگر چنین مقداری وجود نداشته باشد، آخرین پارامتر برگردانده می شود.

=> (یا درست نادرست)
درست

=> (و نادرست نادرست)
غلط

=> (و نادرست 1 درست غلط)
1

توجه:
or به محض دریافت اولین مقدار واقعی، اتصال کوتاه می کند و ارزیابی پارامترها را متوقف می کند
مواجه شده.

=> (یا True (چاپ "سلام"))
درست

چاپ
چاپ برای خروجی روی صفحه استفاده می شود. مثال استفاده:

(چاپ "سلام دنیا!")

توجه:
چاپ همیشه برمی گردد هیچ.

شبه نقل قول
شبه نقل قول به شما امکان می دهد یک فرم را نقل قول کنید، اما عبارات را نیز به صورت انتخابی ارزیابی کنید.
عبارات داخل a شبه نقل قول را می توان به صورت انتخابی با استفاده از نقل قول (~).
فرم ارزیابی شده را نیز می توان با استفاده از آن متصل کرد unquote-splice (~@). شبه نقل قول نیز می تواند باشد
نوشته شده با استفاده از نقل قول (`) سمبل.

;; اجازه دهید 'qux' یک متغیر با مقدار باشد (bar baz)
`(foo ~ qux)
; معادل '(فو (بار باز))
`(foo ~@qux)
; معادل '(foo bar baz)

نقل قول کردن
نقل قول کردن فرم ارسال شده را بدون ارزیابی آن برمی گرداند. نقل قول کردن به طور متناوب می تواند باشد
نوشته شده با استفاده از آپستروف (') سمبل.

=> (setv x '(چاپ "Hello World"))
; متغیر x روی بیان تنظیم شده است و ارزیابی نمی شود
=> x
(u'print' u'Hello World')
=> (معادل x)
سلام جهان

نیاز
نیاز برای وارد کردن ماکروها از یک ماژول معین استفاده می شود. حداقل به یک پارامتر نیاز دارد
تعیین ماژول که ماکروها باید وارد شوند. چندین ماژول را می توان وارد کرد
با یک تک نیاز.

مثال زیر ماکروها را از آن وارد می کند واحد 1 و واحد 2:

(نیاز به ماژول-1 ماژول-2)

استراحت / سی دی
استراحت و سی دی مجموعه ارسال شده به عنوان آرگومان را بدون عنصر اول برگردانید:

=> (استراحت (محدوده 10))
[1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9]

مجموعه-کامپ
مجموعه-کامپ برای ایجاد مجموعه استفاده می شود. دو یا سه پارامتر طول می کشد. پارامتر اول است
برای کنترل مقدار بازگشتی، در حالی که دومی برای انتخاب موارد از a استفاده می شود
توالی. پارامتر سوم و اختیاری را می توان برای فیلتر کردن برخی از موارد موجود در آن استفاده کرد
دنباله ای بر اساس یک عبارت شرطی.

=> (داده های setv [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]

پرتاب / بالا بردن
La پرتاب or بالا بردن می توان از فرم ها برای بالا بردن یک استفاده کرد استثنا در زمان اجرا مثال استفاده:

(پرت کردن)
; آخرین استثنا را دوباره بلند کنید

(پرتاب خطای IO)
; یک خطای IO را پرتاب کنید

(پرتاب (IOError "foobar"))
; پرتاب یک خطای IO ("foobar")

پرتاب می تواند یک استدلال واحد را بپذیرد (الف استثنا کلاس یا نمونه) یا هیچ آرگومانی برای
آخرین را دوباره بالا ببرید استثنا.

امتحان
La امتحان فرم برای شروع a استفاده می شود امتحان / گرفتن مسدود کردن. فرم به صورت زیر استفاده می شود:

(تلاش كردن
(عملکرد مستعد خطا)
([e ZeroDivisionError] را بگیرید («تقسیم بر صفر» را چاپ کنید))
(دیگر (چاپ "بدون خطا"))
(در نهایت (چاپ "همه انجام شد")))

امتحان باید حداقل یک مورد داشته باشد گرفتن بلوک، و ممکن است به صورت اختیاری شامل یک دیگر or سرانجام
مسدود کردن. اگر خطایی با یک بلوک catch منطبق در حین اجرا مطرح شود
عملکرد مستعد خطا، که گرفتن بلوک اجرا خواهد شد. اگر هیچ خطایی مطرح نشود، دیگر
بلوک اجرا می شود. در سرانجام بلوک آخرین بار صرف نظر از اینکه یا نه اجرا می شود
خطا مطرح شد

مگر
La مگر ماکرو مختصری برای نوشتن an است if بیانیه ای که بررسی می کند که آیا داده شده است
مشروط است غلط. شکل زیر گسترش این ماکرو را نشان می دهد.

(مگر اینکه بیان شرطی)

(اگر مشروط باشد
هیچ
(انجام بیانیه))

نقل قول
در قالب شبه نقل قول، نقل قول ارزیابی نیروها از یک نماد نقل قول نام مستعار است
جزر و مد (~) سمبل.

(نام تعریف شده "Cuddles")
(شبه نقل قول (= نام (نام بدون نقل قول)))
;=> (u'=' نام شما' u'Cuddles')

`(= نام ~ نام)
;=> (u'=' نام شما' u'Cuddles')

unquote-splice
unquote-splice ارزیابی یک نماد را در یک شکل شبه نقل‌قولی، بسیار شبیه به آن، وادار می‌کند
نقل قول. unquote-splice فقط زمانی می توان استفاده کرد که نماد بدون نقل قول حاوی یک باشد
مقدار تکرارشونده، زیرا آن تکرارپذیر را به شکل شبه نقل قول "پیچیده" می کند. unquote-splice is
نام مستعار به ~@ سمبل.

(اعداد تعریف شده [1 2 3 4])
(شبه نقل قول (+ (عددهای بدون نقل قول)))
;=> (u'+' 1L 2L 3L 4L)

`(+ ~@nums)
;=> (u'+' 1L 2L 3L 4L)

چه زمانی
چه زمانی مشابه است مگر، به جز زمانی که شرطی داده شده تست می کند درست. این نیست
امکان داشتن یک دیگر بلوک در یک چه زمانی ماکرو زیر گسترش را نشان می دهد
کلان

(وقتی بیان شرطی)

(اگر مشروط باشد (گزاره انجام دهید))

در حین
در حین برای اجرای یک یا چند بلوک تا زمانی که یک شرط برقرار باشد استفاده می شود. به شرح زیر
نمونه خروجی "Hello world!" به صفحه نمایش به طور نامحدود:

(در حالی که True (چاپ "سلام دنیا!"))

با
با برای قرار دادن اجرای یک بلوک در یک مدیر زمینه استفاده می شود. زمینه
سپس مدیر می‌تواند سیستم محلی را راه‌اندازی کند و آن را به روشی کنترل‌شده خراب کند. در
نمونه باستانی استفاده از با هنگام پردازش فایل ها است. با می تواند زمینه را به یک پیوند دهد
استدلال کنید یا آن را به طور کامل نادیده بگیرید، همانطور که در زیر نشان داده شده است:

(با بلوک [[arg (expr)]]

(با بلوک [[(expr)]]

(با [[arg (expr)] [(expr)]] بلوک)

مثال زیر باز خواهد شد اخبار فایل و محتوای آن را روی صفحه چاپ کنید. را
فایل پس از پردازش به طور خودکار بسته می شود.

(با [[f (باز کردن "NEWS")]] (چاپ (. خواندن f)))

با دکوراتور
با دکوراتور برای بسته بندی یک تابع با تابع دیگر استفاده می شود. عملکردی که
دکوراسیون باید یک مقدار واحد را بپذیرد: تابعی که در حال تزئین است، و یک مقدار جدید را برگرداند
تابع. با دکوراتور حداقل دو پارامتر را می گیرد: عملکردی که انجام می دهد
دکوراسیون و عملکرد در حال تزئین. بیش از یک عملکرد دکوراتور می تواند باشد
کاربردی؛ آنها به ترتیب از بیرونی به درونی اعمال خواهند شد، یعنی. اولین
دکوراتور بیرونی ترین خواهد بود و غیره. به دکوراتورهایی که استدلال دارند عادل می گویند
مانند فراخوانی تابع

(با دکوراتور دکوراتور-سرگرم کننده
(تعریف برخی از عملکردها [] ...)

(با دکوراتور دکوراتور1 دکوراتور2 ...
(تعریف برخی از عملکردها [] ...)

(با دکوراتور (دکوراتور ارگ) ..
(تعریف برخی از عملکردها [] ...)

در مثال زیر، inc-decorator برای تزئین عملکرد استفاده می شود اضافه با یک
تابعی که دو پارامتر می گیرد و تابع تزئین شده را با مقادیری فراخوانی می کند
افزایش 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-decorator [func]
... (fn [value-1 value-2] (func (+ value-1 2) (+ value-2 2))))

=> (با دکوراتور inc-decorator (افزودن تعریف [ab] (+ ab)))
=> (اضافه 1 1)
4
=> (with-decorator inc2-decorator inc-decorator
... (افزودن تعریف [ab] (+ ab)))
=> (اضافه 1 1)
8

with-gensyms
جدید در نسخه 0.9.12.

with-gensym برای تولید مجموعه ای از gensym برای استفاده در ماکرو کد زیر:

(with-gensyms [abc]
...)

گسترش می یابد به:

(اجازه دهید [[a (gensym)
[b (gensym)
[ج (جنسیت)]]
...)

ببینید منبع:
بخش using-gensym

محصول
محصول برای ایجاد یک شی مولد که یک یا چند مقدار را برمی گرداند استفاده می شود. ژنراتور
قابل تکرار است و بنابراین می تواند در حلقه ها، درک لیست و موارد مشابه دیگر استفاده شود
سازه ها

تابع اعداد تصادفی نشان می دهد که چگونه می توان از ژنراتورها برای تولید سری های بی نهایت استفاده کرد
بدون مصرف بی نهایت حافظه

=> (ضرب را تعریف کنید [ضرایب پایه]
... (برای [[(، ضریب پایه) (ضرایب پایه های زیپ)]]
... (بازده (* ضریب پایه))))

=> (ضرب (محدوده 5) (محدوده 5))


=> (مقدار فهرست-کامپیوتر [مقدار (ضرب (محدوده 10) (محدوده 10))])
[0 ، 1 ، 4 ، 9 ، 16 ، 25 ، 36 ، 49 ، 64 ، 81]

=> (وارد کردن تصادفی)
=> (اعداد تصادفی را تعریف کنید [کم زیاد]
... (در حالی که True (بازده (.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.

پایتون 3.3 و UP فقط!

بازده از برای فراخوانی یک subgenerator استفاده می شود. اگر می‌خواهید برنامه روزانه خود را انجام دهید، این کار مفید است
می‌تواند فرآیندهای خود را به برنامه‌ای دیگر تفویض کند، مثلاً اگر از چیزی شبیه به فانتزی استفاده می‌کنید
asyncio.

Hy هسته
هسته توابع
اما آخر
طریقه استفاده: (آخرین جمع)

تکرار کننده همه موارد به جز آخرین مورد را برمی گرداند کلک.

=> (لیست (butlast (محدوده 10)))
[0 ، 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8]

=> (لیست (butlast [1]))
[]

=> (لیست (butlast []))
[]

=> (وارد کردن itertools)
=> (لیست (5 را بگیرید (butlast (itertools.count 10))))
[10 ، 11 ، 12 ، 13 ، 14]

جمع؟
جدید در نسخه 0.10.0.

طریقه استفاده: (کلید؟ x)

بازده درست if x تکرارپذیر است و رشته ای نیست.

=> (جمع کنید؟ [1 2 3 4])
درست

=> (جمع کنید؟ {"a" 1 "b" 2})
درست

=> (جمع؟ "abc")
غلط

منفی
جدید در نسخه 0.10.0.

طریقه استفاده: (مضرات a b)

یک سلول منفی تازه را با ماشین برمی‌گرداند a و cdr b.

=> (setv a (معایب 'hd'tl))

=> (= 'hd (ماشین a))
درست

=> (= 'tl (cdr a))
درست

احمق ها؟
جدید در نسخه 0.10.0.

طریقه استفاده: (معایب؟ فو)

بررسی می کند که آیا فو یک سلول منفی است.

=> (setv a (معایب 'hd'tl))

=> (مضرات؟ الف)
درست

=> (مضرات؟ صفر)
غلط

=> (مضرات؟ [1 2 3])
غلط

دسامبر
طریقه استفاده: (دسامبر x)

یک کمتر از x. معادل با (- x 1). افزایش می دهد TypeError if (نه (عددی؟ ایکس)).

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

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

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

پیاده کردن
جدید در نسخه 0.10.0.

طریقه استفاده: (پیاده کردن درخت &اختیاری [کدژن نادرست])

Python AST را برای Hy داده شده خالی کنید درخت به خروجی استاندارد اگر کدژن is درست، کارکرد
به جای آن کد پایتون را چاپ می کند.

=> (جدا کردن "("Hello World!"))
مدول(
بدن=[
Expr(value=Call(func=Name(id='print')، args=[Str(s='Hello World!')]، keywords=[] starargs=هیچکدام، kwargs=هیچکدام))])

=> (disassemble '(چاپ "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 یکنواخت است افزایش می دهد TypeError if (نه (عددی؟ ایکس)).

=> (حتی؟ 2)
درست

=> (حتی؟ 13)
غلط

=> (حتی؟ 0)
درست

هویت
طریقه استفاده: (هویت x)

آرگومان ارائه شده به تابع را برمی گرداند.

=> (هویت 4)
4

=> (لیست (هویت نقشه [1 2 3 4]))
[1 2 3 4]

وارز
طریقه استفاده: (شامل x)

یک بیشتر از x. معادل با (+ x 1). افزایش می دهد TypeError if (نه (عددی؟ ایکس)).

=> (inc 3)
4

=> (inc 0)
1

=> (inc 12.3)
13.3

نمونه، مثال؟
طریقه استفاده: (نمونه، مثال؟ کلاس x)

بازده درست if x نمونه ای از کلاس.

=> (مثلا؟ float 1.0)
درست

=> (نمونه؟ int 7)
درست

=> (نمونه؟ خیابان (خیابان "foo"))
درست

=> (از کلاس TestClass [object] خارج کنید)
=> (setv inst (TestClass))
=> (مثلا؟ TestClass inst)
درست

عدد صحیح؟
طریقه استفاده: (عدد صحیح؟ x)

بازده درست if x یک عدد صحیح است برای پایتون 2، این یکی است INT or طولانی. برای پایتون 3،
این است INT.

=> (عدد صحیح؟ 3)
درست

=> (عدد صحیح؟ -2.4)
غلط

در هم تنیده کردن
جدید در نسخه 0.10.1.

طریقه استفاده: (میانگین کردن سک 1 سک 2 ...)

یک تکرار از اولین مورد در هر یک از دنباله‌ها، سپس مورد دوم و غیره را برمی‌گرداند.

=> (لیست (interleave (محدوده 5) (محدوده 100 105)))
[0 ، 100 ، 1 ، 101 ، 2 ، 102 ، 3 ، 103 ، 4 ، 104]

=> (لیست (interleave (محدوده 1000000) "abc"))
[0، 'a'، 1، 'b'، 2، 'c']

قرار دادن
جدید در نسخه 0.10.1.

طریقه استفاده: (تداخل کند آیتم دنباله)

یک تکرارپذیر از عناصر دنباله جدا شده توسط مورد را برمی‌گرداند.

=> (لیست (در میان "!" "abcd"))
['آ ب پ ت']

=> (فهرست (interpose -1 (محدوده 5)))
[0، -1، 1، -1، 2، -1، 3، -1، 4]

تکرار شدنی؟
طریقه استفاده: (تکرار؟ x)

بازده درست if x قابل تکرار است اشیای تکرارپذیر زمانی که یک تکرار کننده جدید برمی گرداند (دوباره x) is
تماس گرفت. کنتراست با اشاره گر؟.

=> ;; برای رشته ها کار می کند
=> (قابل تکرار؟ (خیابان "abcde"))
درست

=> ;; برای لیست ها کار می کند
=> (قابل تکرار؟ [1 2 3 4 5])
درست

=> ;; برای تاپل ها کار می کند
=> (قابل تکرار؟ (, 1 2 3))
درست

=> ;; برای دیکته کار می کند
=> (قابل تکرار؟ {:a 1 :b 2:c 3})
درست

=> ;; برای تکرار کننده ها / تولید کنندگان کار می کند
=> (قابل تکرار؟ (تکرار 3))
درست

اشاره گر؟
طریقه استفاده: (اشاره گر؟ x)

بازده درست if x تکرار کننده است Iterators اشیایی هستند که خود را به عنوان یک باز می گردند
تکرار کننده وقتی (دوباره x) نامیده میشود. کنتراست با تکرار شدنی؟.

=> ;; برای یک لیست کار نمی کند
=> (تکرارکننده؟ [1 2 3 4 5])
غلط

=> ;; اما ما می توانیم یک 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 ، 2 ، 3 ، 4]

=> (لیست* 1)
1

=> (مضرات؟ (لیست* 1 2 3 4))
درست

گسترش کلان
جدید در نسخه 0.10.0.

طریقه استفاده: (بسط کلان فرم)

بسط ماکرو کامل را برمی گرداند فرم.

=> (بسط ماکرو '(-> (ab) (xy)))
(u'x' (u'a' u'b') u'y')

=> (بسط ماکرو '(-> (ab) (-> (cd) (ef))))
(u'e' (u'c' (u'a' u'b') u'd') u'f')

macroexpand-1
جدید در نسخه 0.10.0.

طریقه استفاده: (macroexpand-1 فرم)

گسترش ماکرو تک مرحله ای را برمی گرداند فرم.

=> (macroexpand-1 '(-> (ab) (-> (cd) (ef))))
(u'_>' (u'a' u'b') (u'c' u'd') (u'e' u'f'))

ادغام با
جدید در نسخه 0.10.1.

طریقه استفاده: (ادغام با f &باقی مانده نقشه ها)

نقشه‌ای را برمی‌گرداند که شامل بقیه نقشه‌هایی است که ابتدا به آن‌ها متصل شده‌اند. اگر کلیدی در
بیش از یک نقشه، نگاشت(های) از دومی (از چپ به راست) با
نقشه برداری در نتیجه با فراخوانی (f val-in-result val-in-latter).

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

نفی؟
طریقه استفاده: (نفی؟ x)

بازده درست if x کمتر از صفر است افزایش می دهد TypeError if (نه (عددی؟ ایکس)).

=> (نفی؟ -2)
درست

=> (نفی؟ 3)
غلط

=> (نفی؟ 0)
غلط

صفر؟
طریقه استفاده: (نه؟ x)

بازده درست if x is صفر / هیچ.

=> (هیچ؟ هیچ)
درست

=> (هیچ؟ هیچ)
درست

=> (هیچ؟ 0)
غلط

=> (setf x صفر)
=> (هیچ؟ x)
درست

=> ;; list.append همیشه هیچ را برمی گرداند
=> (هیچ؟ (.append [1 2 3] 4))
درست

هیچ یک؟
طریقه استفاده: (هیچ یک؟ x)

بازده درست if x is هیچ.

=> (هیچ کدام؟ هیچ کدام)
درست

=> (هیچ کدام؟ 0)
غلط

=> (setf x هیچ)
=> (هیچ کدام؟ x)
درست

=> ;; list.append همیشه هیچ را برمی گرداند
=> (هیچ کدام؟ (.append [1 2 3] 4))
درست

چهارم
طریقه استفاده: (نهمین کلک n &اختیاری [پیش‌فرض صفر])

برمی گرداند n-امین مورد در یک مجموعه، از 0 شمارش می شود. مقدار پیش فرض را برگردانید، صفر، اگر
خارج از محدوده (مگر اینکه طور دیگری مشخص شده باشد). افزایش می دهد ValueError if n منفی است

=> (nامین [1 2 4 7] 1)
2

=> (nامین [1 2 4 7] 3)
7

=> (هیچ؟ (nامین [1 2 4 7] 5))
درست

=> (nth [1 2 4 7] 5 "پیش فرض")
"پیش فرض"

=> (nامین (3 را بگیرید (2 را رها کنید [1 2 3 4 5 6])) 2))
5

=> (nامین [1 2 4 7] -1)
ردیابی (آخرین تماس اخیر):
...
ValueError: شاخص های islice() باید None یا یک عدد صحیح باشد: 0 <= x <= sys.maxsize.

عددی؟
طریقه استفاده: (عددی؟ x)

بازده درست if x یک عدد است، همانطور که در پایتون تعریف شده است اعداد.شماره کلاس.

=> (عددی؟ -2)
درست

=> (عددی؟ 3.2)
درست

=> (عددی؟ "فو")
غلط

فرد؟
طریقه استفاده: (فرد؟ x)

بازده درست if x عجیب است افزایش می دهد TypeError if (نه (عددی؟ ایکس)).

=> (شخص؟ 13)
درست

=> (شخص؟ 2)
غلط

=> (شخص؟ 0)
غلط

پوز
طریقه استفاده: (پس؟ x)

بازده درست if x بزرگتر از صفر است افزایش می دهد TypeError 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 یک نماد است

=> (نماد؟ 'فو)
درست

=> (نماد؟ '[abc])
غلط

صفر؟
طریقه استفاده: (صفر؟ x)

بازده درست if x صفر است

=> (صفر؟ 3)
غلط

=> (صفر؟ -2)
غلط

=> (صفر؟ 0)
درست

دنباله توابع
توابع دنباله ای می توانند بدون ایجاد یک دنباله بالقوه نامتناهی عمل کنند
نیاز به دنباله به طور کامل در یک لیست یا ظرف مشابه تحقق یابد. آنها این کار را انجام می دهند
بازگرداندن یک تکرار کننده پایتون

می‌توانیم از مولد اعداد فیبوناچی نامحدود متعارف به عنوان مثالی برای نحوه استفاده استفاده کنیم
برخی از این توابع

(تعریف فیب []
(تنظیم 0)
(setv b 1)
(در حالی که درست است
(بازده الف)
(setv (, ab) (, b (+ ab)))))

توجه داشته باشید که (در حالی که درست ...) حلقه اگر این را در REPL اجرا کنیم،

=> (فیب)


فراخوانی تابع فقط یک تکرار کننده را برمی گرداند، اما تا زمانی که آن را مصرف نکنیم، کار نمی کند.
امتحان کردن چیزی مانند این توصیه نمی شود زیرا حلقه بی نهایت تا آن زمان اجرا می شود
تمام رم موجود را مصرف می کند، یا در این مورد تا زمانی که آن را بکشم.

=> (لیست (fib))
[1] 91474 هی

برای به دست آوردن 10 عدد فیبوناچی اول، استفاده کنید گرفتن. توجه داشته باشید که گرفتن همچنین یک ژنراتور را برمی گرداند،
بنابراین من یک لیست از آن ایجاد می کنم.

=> (لیست (10 تا (فیب)))
[0 ، 1 ، 1 ، 2 ، 3 ، 5 ، 8 ، 13 ، 21 ، 34]

برای بدست آوردن عدد فیبوناچی در شاخص 9، (شروع از 0):

=> (nامین (fib) 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]

=> (لیست (متمایز []))
[]

=> (لیست (متمایز (تکرار [ 1 2 3 4 3 5 2 ])))
[1 ، 2 ، 3 ، 4 ، 5]

قطره
طریقه استفاده: (رها کردن n جمع)

یک تکرار کننده را با رد شدن از اولین تکرار برمی گرداند n اعضای کلک. افزایش می دهد ValueError 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 موارد در کلک. افزایش می دهد ValueError 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 هیچ "a"])))
[هیچکدام، اوا]

=> (لیست (در حال رها کردن پوز؟ [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"])
['foo', 1, 2, 1, 2, 3, 4, 'bar']

تکرار
طریقه استفاده: (تکرار کنید fn x)

یک تکرار کننده از x, fn(x), fn(fn(x))، و غیره

=> (لیست (5 را بگیرید (5 را تکرار کنید))
[5 ، 6 ، 7 ، 8 ، 9]

=> (لیست (5 را بگیرید (تکرار (fn [x] (* xx)) 5)))
[5 ، 25 ، 625 ، 390625 ، 152587890625]

خواندن
طریقه استفاده: (خواندن &اختیاری [از فایل eof])

عبارت Hy بعدی را از می خواند از فایل (پیش‌فرض به sys.stdin)، و می تواند یک
تک بایت به عنوان EOF (پیش فرض به یک رشته خالی). افزایش می دهد خطای EOFE if از فایل قبل به پایان می رسد
یک عبارت کامل قابل تجزیه است.

=> (بخوانید)
(+ 2 2)
('+' 2 2)
=> (Eval (خوانده شده))
(+ 2 2)
4

=> (وارد کردن io)
=> (بافر def (io.StringIO "(+ 2 2)\n(- 2 1)"))
=> (eval (اعمال خواندن [] {"from_file" buffer}))
4
=> (eval (اعمال خواندن [] {"from_file" buffer}))
1

=> ; با فرض "example.hy" حاوی:
=> ; (چاپ "سلام")
=> ; (چاپ "hyfriends!")
=> (با [[f (باز کردن "example.hy")]]
... (تلاش كردن
... (در حالی که درست است
... (اجازه دهید [[exp (خواندن f)]]
... (انجام دادن
... (چاپ "OHY" exp)
... (Eval Exp))))
... ([e EOFError] را بگیرید
... (چاپ "EOF!"))))
OHY ("چاپ" "سلام")
سلام
OHY ("چاپ" "hyfriends!")
دوستان دورگه
EOF!

برداشتن
طریقه استفاده: (برداشتن پیش جمع)

یک تکرار کننده را از کلک با عناصری که از محمول عبور می کنند، پیش، حذف شده.

همچنین مشاهده کنید فیلتر.

=> (لیست (حذف فرد؟ [1 2 3 4 5 6 7]))
[2، 4، 6]

=> (لیست (پوست حذف شود؟ [1 2 3 4 5 6 7]))
[]

=> (لیست (حذف neg؟ [1 2 3 4 5 6 7]))
[1، 2، 3، 4، 5، 6، 7]

تکرار
طریقه استفاده: (تکرار x)

یک تکرار کننده (بی نهایت) از را برمی گرداند x.

=> (لیست (6 تا (تکرار "s")))
[تو، تو، تو، تو، تو، تو، تو]

بارها و بارها
طریقه استفاده: (به طور مکرر fn)

با تماس، یک تکرارکننده را برمی‌گرداند fn بارها و بارها

=> (وارد کردن [تصادفی [randint]])

=> (لیست (5 را بگیرید (به طور مکرر (Fn [] (randint 0 10)))))
[6 ، 2 ، 0 ، 6 ، 7]

گرفتن
طریقه استفاده: ( بگیر n جمع)

یک تکرار کننده حاوی اولی را برمی گرداند n اعضای کلک. افزایش می دهد ValueError if n is
منفی.

=> (لیست (3 [1 2 3 4 5]))
[1، 2، 3]

=> (لیست (4 تا (تکرار "s")))
[تو، تو، تو، تو، تو]

=> (لیست (0 تا (تکرار "s")))
[]

گرفتن nth
طریقه استفاده: (برداشتن 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]

در حالی که
طریقه استفاده: (در حالی که پیش جمع)

یک تکرار کننده را از کلک تا زمانیکه پیش بازده درست.

=> (لیست (take-while pos؟ [ 1 2 3 -4 5]))
[1، 2، 3]

=> (لیست (در حالی که نفی؟ [ -4 -3 1 2 5]))
[-4، -3]

=> (لیست (در حالی که نفی؟ [ 1 2 3 -4 5]))
[]

zipwith
جدید در نسخه 0.9.13.

طریقه استفاده: (زیپ با fn کلک ...)

معادل با زیپ، اما به جای ایجاد یک تاپل از یک تابع چند آرگومان استفاده می کند. اگر
zipwith سپس با N مجموعه فراخوانی می شود fn باید N آرگومان را بپذیرد.

=> (اپراتور واردات)
=> (لیست (zipwith operator.add [1 2 3] [4 5 6]))
[5، 7، 9]

خواننده ماکرو
ماکروهای Reader به Lisp این قدرت را می‌دهند که سریعاً سینتکس را تغییر داده و تغییر دهد. شما نمی خواهید
نماد لهستانی؟ یک ماکرو خواننده به راحتی می تواند این کار را انجام دهد. روش Clojure را برای داشتن یک می خواهید
regex؟ ماکروهای Reader نیز می توانند این کار را به راحتی انجام دهند.

نحو
=> (دفریدر ^ [expr] (print expr))
=> #^(1 2 3 4)
(1)
=> #^"سلام"
"سلام"
=> #^1+2+3+4+3+2
1+2+3+4+3+2

Hy هیچ کلمه ای برای تاپل ها ندارد. بیایید بگوییم دوست ندارید (, ...) و چیز دیگری میخواهد این
مشکلی است که ماکروهای خواننده قادر به حل آن به روشی منظم هستند.

=> (defreader t [expr] `(, ~@expr))
=> #t(1 2 3)
(1، 2، 3)

شما حتی می توانید آن را مانند Clojure انجام دهید و یک عبارات تحت اللفظی برای عبارات منظم داشته باشید!

=> (واردات مجدد)
=> (defreader r [expr] `(re.compile ~expr))
=> #r".*"
<_sre.SRE_Pattern شی در 0xcv7713ph15#>

پیاده سازی
مرده زدا یک کاراکتر را به عنوان نام نماد برای ماکرو خواننده می گیرد. هر چیزی بیشتر
یک خطا را برمی گرداند. از نظر اجرا، مرده زدا گسترش می یابد و به لامبدا پوشیده شده با a
دکوراتور این دکوراتور لامبدا را در دیکشنری با نام ماژول و
سمبل.

=> (دفریدر ^ [expr] (print expr))
;=> (with_decorator (hy.macros.reader ^) (fn [expr] (print expr)))

# گسترش می یابد (dispatch_reader_macro ...) جایی که نماد و عبارت به آن منتقل می شود
عملکرد صحیح

=> #^()
;=> (dispatch_reader_macro ^ ())
=> #^"سلام"
"سلام"

هشدار:
به دلیل محدودیت در lexer و تجزیه کننده Hy، ماکروهای خواننده نمی توانند تعریف شده را دوباره تعریف کنند.
نحوی مانند ()[]{}. به احتمال زیاد در آینده به این موضوع پرداخته خواهد شد.

داخلی Hy مستندات
توجه:
این بیت ها بیشتر برای افرادی که خود Hy را هک می کنند مفید هستند، اما می توانند برای آنها نیز استفاده شوند
کسانی که در برنامه نویسی ماکرو عمیق تر هستند.

Hy مدل
معرفی به Hy مدل
مدل‌های Hy یک لایه بسیار نازک در بالای اشیاء معمولی پایتون هستند که منبع Hy را نشان می‌دهند
کد به عنوان داده مدل‌ها فقط اطلاعات موقعیت منبع، و تعداد انگشت شماری روش را به آن اضافه می‌کنند
از دستکاری پاک کد منبع Hy، به عنوان مثال در ماکروها، پشتیبانی می کند. برای رسیدن به آن
هدف، مدل های Hy ترکیبی از یک کلاس پایتون پایه و HyObject.

HyObject
hy.models.HyObject کلاس پایه مدل های Hy است. فقط یک روش را اجرا می کند، جایگزین کردن,
که موقعیت منبع شی فعلی را با چیزی که به عنوان آرگومان ارسال شده جایگزین می کند.
این به ما امکان می دهد موقعیت اصلی عباراتی را که توسط آنها اصلاح می شوند را پیگیری کنیم
ماکروها، چه در کامپایلر و چه در ماکروهای hy خالص.

HyObject در نظر گرفته شده است که به طور مستقیم برای نمونه سازی مدل های Hy استفاده نمی شود، بلکه فقط به عنوان یک میکسین است
برای کلاس های دیگر

ترکیب مدل
لیست های پرانتز و پرانتز به عنوان مدل های ترکیبی توسط تجزیه کننده Hy تجزیه می شوند.

HyList
hy.models.list.HyList کلاس پایه مدل های Hy "تکرارپذیر" است. کاربرد اساسی آن این است که
نشان دهنده پرانتز [] لیست هایی که وقتی به عنوان یک عبارت سطح بالا استفاده می شود، به آنها ترجمه می شود
پایتون در مرحله کامپایل، فهرست‌های واقعی را فهرست می‌کند.

افزودن HyList به یک شیء تکرارشونده دیگر از کلاس شی سمت چپ استفاده مجدد می کند.
به عنوان مثال، زمانی که می خواهید اشیاء Hy را در یک ماکرو به هم متصل کنید، یک رفتار مفید است.

HyExpression
hy.models.expression.HyExpression ارث می برد HyList برای پرانتز () اصطلاحات. در
نتیجه کامپایل آن عبارات به عنصر اول لیست بستگی دارد: the
کامپایلر عبارات را بین فرم های ویژه کامپایلر، ماکروهای تعریف شده توسط کاربر و
فراخوانی معمولی تابع پایتون

HyDict
hy.models.dict.HyDict ارث می برد HyList برای فرفری پرانتز {} عباراتی که کامپایل می کنند
به معنای واقعی کلمه یک فرهنگ لغت پایتون.

تصمیم استفاده از یک لیست به جای دیکت به عنوان کلاس پایه برای HyDict راحت تر اجازه می دهد
دستکاری دستورات در ماکروها، با مزیت اضافه اجازه دادن به عبارات ترکیبی
به عنوان کلیدهای دیکت (به عنوان مثال، HyExpression کلاس پایتون قابل هش نیست).

اتمی مدل
در جریان ورودی، رشته‌های دو نقل قول شده، با رعایت نماد پایتون برای رشته‌ها،
به عنوان یک نشانه تجزیه می شوند که مستقیماً به صورت a تجزیه می شود HyString.

یک رشته بدون وقفه از کاراکترها، به استثنای فاصله، براکت، نقل قول، نقل قول دوگانه
و نظرات، به عنوان یک شناسه تجزیه می شود.

شناسه‌ها به ترتیب زیر به مدل‌های اتمی در مرحله تجزیه تجزیه می‌شوند:

· HyInteger

· HyFloat

· HyComplex (اگر اتم خالی نباشد j)

· کلمه کلیدی (اگر اتم با :)

· نماد

HyString
hy.models.string.HyString کلاس پایه مدل های Hy معادل رشته است. آن را نیز
نشان دهنده لفظ رشته دو نقل قول شده است، ""، که به رشته یونیکد کامپایل می شود
حروف واقعی در پایتون HyStrings اشیاء یونیکد را در پایتون 2 به ارث می برند و اشیاء رشته ای را در
پایتون 3 (و بنابراین وابسته به کدگذاری نیستند).

HyString مدل های مبتنی بر تغییر ناپذیر هستند.

رشته های Hy literal می توانند چندین خط را بپوشانند و توسط تجزیه کننده به عنوان یک واحد در نظر گرفته می شوند
واحد، با احترام به فرار پایتون برای رشته های یونیکد.

عددی مدل
hy.models.integer.HyInteger اعداد صحیح را نشان می دهد (با استفاده از طولانی روی پایتون 2 تایپ کنید،
و INT در پایتون 3).

hy.models.float.HyFloat نشان دهنده حرف ممیز شناور است.

hy.models.complex.HyComplex لفظ های پیچیده را نشان می دهد.

مدل‌های عددی با استفاده از روال پایتون مربوطه و پایتون عددی معتبر تجزیه می‌شوند.
literals به همتای Hy خود تبدیل خواهند شد.

نماد
hy.models.symbol.HySymbol مدلی است که برای نشان دادن نمادها در زبان Hy استفاده می شود. آی تی
ارث می برد HyString.

نماد برای کمک به قابلیت همکاری پایتون، اشیاء در فاز تجزیه به هم ریخته می شوند:

· نمادهای احاطه شده با ستاره (*) به حروف بزرگ تبدیل می شوند.

· خط تیره (-) به زیرخط تبدیل می شوند (_);

یک علامت سوال دنباله دار (?) به پیشرو تبدیل می شود است_.

هشدار: از آنجایی که مانگلینگ در مرحله تجزیه انجام می شود، این امکان وجود دارد
به صورت برنامه نویسی HySymbolهایی تولید کنید که با کد منبع Hy قابل تولید نیستند. مثل
مکانیسم توسط gensym برای تولید نمادهای "غیرمطلب" استفاده می شود.

کلمه کلیدی
hy.models.keyword.HyKeyword نشان دهنده کلمات کلیدی در Hy است. کلمات کلیدی نمادهایی هستند که با آن شروع می شوند
a :. کلاس ارث می برد HyString.

برای تشخیص HyKeywords از جانب نمادها، بدون امکان (غیر ارادی)
برخوردها، کاراکتر یونیکد با استفاده خصوصی "\uFDD0" به کلمه کلیدی literal اضافه می شود
قبل از ذخیره سازی

منفی سلول ها
hy.models.cons.HyCons نمایشی از Python-friendly است منفی سلول های. سلول های منفی هستند
به ویژه برای تقلید از ویژگی های انواع "معمول" LISP مانند Scheme یا Common مفید است
لیسپ

یک سلول منفی یک شی 2 موردی است که حاوی a است ماشین (سر) و الف سی دی (دم). در برخی از Lisp
انواع مختلف، سلول منفی بلوک اصلی ساختمان است، و عبارات S در واقع هستند
به عنوان لیست پیوندی سلول های منفی نشان داده می شود. طبق معمول در Hy اینطور نیست
عبارات از لیست های پایتون پیچیده شده در a ساخته شده اند HyExpression. با این حال HyCons
رفتار انواع Lisp "معمول" را به این ترتیب تقلید می کند:

· (مضرات چیزی صفر) is (HyExpression [چیزی])

· (مضرات چیزی چند لیست) is ((نوع چند لیست) (+ [چیزی] چند لیست)) (اگر
چند لیست ارث می برد از فهرست).

· (گرفتن (مضرات a b) 0) is a

· (تکه (مضرات a b) 1) is b

Hy از یک نحو فهرست نقطه‌ای پشتیبانی می‌کند، جایی که '(آ . b) به معنی (مضرات 'a 'ب) و '(آ b . c) به معنی
(مضرات 'a (مضرات 'b ج)). اگر کامپایلر با یک سلول منفی در سطح بالا مواجه شود، افزایش می یابد
یک خطای تلفیقی

HyCons آرگومان‌های ارسال شده (car و cdr) را در انواع Hy می‌پیچد تا دستکاری آن را آسان‌تر کند
سلول های منفی در یک زمینه کلان

Hy داخلی نظریه
بررسی اجمالی
درونی‌های Hy با عمل کردن به‌عنوان یک فرانت‌اند برای بایت کد پایتون عمل می‌کنند، به طوری که خود Hy
به بایت کد پایتون کامپایل می شود و به یک زمان اجرای پایتون اصلاح نشده اجازه می دهد تا کد Hy را اجرا کند.
بدون اینکه حتی متوجه آن شود

روشی که ما این کار را انجام می دهیم با ترجمه Hy به یک ساختار داده داخلی Python AST و
با استفاده از ماژول هایی از استاندارد پایتون، آن AST را به بایت کد پایتون تبدیل کنید
کتابخانه، به طوری که ما مجبور نیستیم تمام کارهای داخلی پایتون را برای هر یک کپی کنیم
انتشار تک پایتون.

Hy در چهار مرحله کار می کند. بخش های زیر هر مرحله از Hy از منبع تا را پوشش خواهند داد
زمان اجرا

مراحل 1 و 2: حرف زدن و تجزیه
اولین مرحله از کامپایل Hy این است که منبع را به توکن هایی که می توانیم با آنها برخورد کنیم، لکس کنیم. ما
از پروژه ای به نام rply استفاده کنید که یک تجزیه کننده واقعا خوب (و سریع) است که در یک زیر مجموعه نوشته شده است
از پایتون به نام rpython.

کد lexing همه در تعریف شده است hy.lex.lexer. این کد بیشتر فقط Hy را تعریف می کند
دستور زبان، و تمام قسمت های سخت واقعی توسط rply مراقبت می شود - ما فقط تعریف می کنیم
"بازگشت تماس" برای پاسخ در hy.lex.parser، که توکن های تولید شده را می گیرد و آن را برمی گرداند
مدل های های.

شما می توانید مدل های Hy را به عنوان "AST" برای Hy در نظر بگیرید، این همان چیزی است که ماکروها روی آن عمل می کنند
(مستقیم)، و این همان چیزی است که کامپایلر هنگام کامپایل Hy down از آن استفاده می کند.

ببینید منبع:
بخش Hy مدل برای اطلاعات بیشتر در مورد مدل های Hy و معنای آنها.

گام 3: Hy فيلم هاي سكسي تلفيقي به پــایتــون AST
اینجا جایی است که بیشتر جادو در Hy اتفاق می افتد. اینجاست که ما Hy AST (مدل ها) را می گیریم.
و آنها را در Python AST کامپایل کنید. چند اتفاق بد در اینجا رخ می دهد تا چند مورد را پشت سر بگذارد
مشکلات در AST و کار در کامپایلر از مهمترین کارهایی است که انجام می دهیم
دارند.

کامپایلر کمی پیچیده است، بنابراین اگر در اولین شات آن را بزرگ نکنید، احساس بدی نداشته باشید.
ممکن است کمی زمان ببرد تا درست شود.

نقطه ورود اصلی به کامپایلر است HyASTCompiler.compile. این روش فراخوانی می شود و
تنها متد واقعی "عمومی" در کلاس (یعنی ما واقعاً به آن قول نمی دهیم
API فراتر از آن روش).

در واقع، حتی در داخل، ما به سختی به طور مستقیم تکرار نمی کنیم، تقریبا همیشه مجبوریم
درخت Hy از طریق گردآوری، و اغلب این کار را با عناصر فرعی یک عبارت انجام می دهد
که ما داریم این وظیفه توزیع کننده مبتنی بر نوع است که عناصر فرعی را به درستی ارسال کند.

تمام متدهایی که یک کامپایل را پیش می سازند با علامت علامت گذاری می شوند @builds() دکوراتور تو می توانی
یا کلاس مدل Hy را که کامپایل می کند پاس کنید یا می توانید از یک رشته برای آن استفاده کنید
اصطلاحات. من این را در یک ثانیه روشن می کنم.

نام خانوادگی صحنه نوع اعزام
بیایید در شروع کنیم گردآوری روش. اولین کاری که انجام می دهیم این است که نوع چیز را بررسی کنیم
ما در حال ساختن هستیم ما نگاه می کنیم تا ببینیم آیا روشی داریم که بتواند آن را بسازد type() که ما
دارند، و به روشی که می تواند آن را مدیریت کند ارسال کنید. اگر هیچ روشی نداریم که بتوانیم
ساخت آن نوع، ما یک داخلی را افزایش می دهیم استثنا.

به عنوان مثال، اگر ما یک HyString، ما یک نگاشت تقریبا 1 به 1 از Hy AST به پایتون داریم
AST. در کامپایل_رشته روش طول می کشد HyString، و an را برمی گرداند ast.Str() این است
پر شده با شماره خطوط و محتوای صحیح.

ماکرو گسترش
اگر یک را دریافت کنیم HyExpression، سعی می کنیم ببینیم آیا این یک ماکرو شناخته شده است یا خیر، و برای داشتن آن فشار خواهیم آورد
با فراخوانی گسترش یافت hy.macros.macroexpand، سپس نتیجه را به داخل فشار دهید
HyASTCompiler.compile.

دوم صحنه بیان- اعزام
تنها مورد خاص این است HyExpression، از آنجایی که باید بسته به AST متفاوتی ایجاد کنیم
در فرم مخصوص مورد نظر به عنوان مثال، وقتی به یک ضربه می زنیم (اگر درست درست نادرست)، ما
نیاز به تولید الف ast.اگر، و گره های فرعی را به درستی کامپایل کنید. اینجاست که @builds()
با یک رشته به عنوان آرگومان وارد می شود.

برای compile_expression (که با یک تعریف می شود @builds (HyExpression)) ارسال خواهد کرد
بر اساس رشته آرگومان اول. اگر بنا به دلایلی استدلال اول اینطور نیست
یک رشته، آن مورد را نیز به درستی مدیریت می کند (به احتمال زیاد با بالا بردن یک استثنا).

اگر رشته برای Hy شناخته نشده باشد، به طور پیش فرض یک را ایجاد می کند ast.تماس، که سعی خواهد کرد
یک تماس زمان اجرا انجام دهید (در پایتون، چیزی شبیه به فو ()).

مسائل مربوط به اصابت با پــایتــون AST
Python AST عالی است. این چیزی است که ما را قادر می سازد تا چنین پروژه قدرتمندی را در بالای آن بنویسیم
پایتون بدون نیاز به مبارزه زیاد با پایتون. مانند هر چیز دیگری، ما سهم خود را داشته ایم
مشکلات، و در اینجا لیست کوتاهی از موارد رایجی است که ممکن است با آنها برخورد کنید.

پــایتــون افتراق می دهد میان بیانیه و عبارات.

این ممکن است به نظر مشکل بزرگی نباشد - در واقع، برای اکثر برنامه نویسان پایتون، این کار خواهد بود
به زودی تبدیل به یک لحظه "خب، بله".

در پایتون، انجام کاری شبیه به:

چاپ برای x in محدوده(10): عبور، به دلیل چاپ عبارات را چاپ می کند و برای نیست
بیان، یک دستور جریان کنترل است. چیزهایی مانند 1 + 1 عبارات هستند، همانطور که هست یازدهمین حرف الفبای یونانی
x: 1 + x، اما سایر ویژگی های زبان، مانند if, برای، یا در حین بیانیه ها هستند.

از آنجایی که آنها هیچ "ارزشی" برای پایتون ندارند، این کار در Hy را سخت می کند، زیرا انجام کاری انجام می شود
پسندیدن (چاپ (اگر درست درست نادرست)) نه تنها رایج است، بلکه انتظار می رود.

در نتیجه، ما با استفاده از a به طور خودکار چیزها را منهدم می کنیم نتیجه شی، جایی که ما هر موردی را ارائه می دهیم ast.stmt
که نیاز به اجرا، و تنها ast.expr که می توان از آن برای بدست آوردن ارزش هر چیزی استفاده کرد
فقط اجرا شد Hy این کار را با اجبار انتساب به چیزها در حین دویدن انجام می دهد.

به عنوان مثال، Hy:

(چاپ (اگر درست باشد نادرست))

تبدیل خواهد شد به:

اگر درست است:
_mangled_name_here = درست است
دیگری:
_mangled_name_here = نادرست

چاپ _mangled_name_here

خوب، این کمی دروغ بود، زیرا ما در واقع آن عبارت را به این شکل تبدیل می کنیم:

درست است اگر درست است غیر صحیح چاپ کنید

با تحمیل اشیا به یک ast.expr اگر بتوانیم، اما ایده کلی برقرار است.

گام 4: پــایتــون کد Bytecode تولید و زمان اجرا
بعد از اینکه درخت AST پایتون کامل شد، می‌توانیم آن را به پایتون کامپایل کنیم
بایت کد با فشار دادن آن ارزیابی. از اینجا به بعد دیگر کنترلی در دست نداریم و
پایتون از همه چیز مراقبت می کند. به همین دلیل مواردی مانند ردیابی پایتون، pdf و
برنامه های جنگو کار می کنند.

Hy ماکرو
با استفاده از gensym برای امن تر ماکرو
هنگام نوشتن ماکروها، باید مراقب بود که از گرفتن متغیرهای خارجی یا استفاده از آن خودداری کرد
نام متغیرهایی که ممکن است با کد کاربر تضاد داشته باشند.

ما از یک مثال ماکرو استفاده خواهیم کرد نیف (نگاه کنید به
http://letoverlambda.com/index.cl/guest/chap3.html# ثانیه_5 برای توضیحات کامل تر.)
نیف یک مثال است، چیزی شبیه یک عدد if، جایی که بر اساس عبارت، یکی از
بسته به مثبت، صفر یا منفی بودن عبارت، 3 شکل فراخوانی می شود.

اولین پاس ممکن است چیزی شبیه به:

(defmacro nif [expr pos-form zero-form neg-form)
`(اجازه دهید [[ابسکر نام ~expr]]
(cond [(pos? obscure-name) ~pos-form]
[(صفر؟ نام مبهم) ~صفر شکل]
[(نفی؟ نام مبهم) ~neg-form])))

جایی که نام مبهم تلاشی برای انتخاب نام برخی از متغیرها برای عدم تضاد با نام دیگر است
کد اما البته، با وجود حسن نیت، این تضمینی نیست.

روش gensym برای ایجاد یک نماد جدید و منحصر به فرد برای چنین موقعیتی طراحی شده است.
نسخه بسیار بهتری از نیف خواهد بود:

(defmacro nif [expr pos-form zero-form neg-form)
(اجازه دهید [[g (gensym)]]
`(اجازه دهید [[~g ~expr]]
(کاند [(pos? ~g) ~pos-form]
[(صفر؟ ~g) ~صفر شکل]
[(neg? ~g) ~neg-form]))))

این یک مورد آسان است، زیرا تنها یک نماد وجود دارد. اما اگر به چند مورد نیاز باشد
gensym یک ماکرو دوم با-gensym وجود دارد که اساساً به یک سری از گسترش می‌یابد اجازه
بیانیه:

(with-gensyms [abc]
...)

گسترش می یابد به:

(اجازه دهید [[a (gensym)
[b (gensym)
[ج (جنسیت)]]
...)

بنابراین ما دوباره نوشته شده است نیف به نظر می رسد مانند:

(defmacro nif [expr pos-form zero-form neg-form)
(با-جنس [g]
`(اجازه دهید [[~g ~expr]]
(کاند [(pos? ~g) ~pos-form]
[(صفر؟ ~g) ~صفر شکل]
[(neg? ~g) ~neg-form]))))

در نهایت، اگرچه ما می توانیم یک ماکرو جدید بسازیم که همه این کارها را برای ما انجام دهد. defmacro/g! خواهد گرفت
تمام نمادهایی که با g! و به طور خودکار تماس بگیرید gensym با باقی مانده از
سمبل. بنابراین GA تبدیل خواهد شد ( gensym "آ").

نسخه نهایی ما از نیف، ساخته شده با defmacro/g! تبدیل می شود:

(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 کامپایلر توکار

کنترل کننده مدولا شاخص


فهرست:

آنافوریک ماکرو
جدید در نسخه 0.9.12.

ماژول ماکروهای آنافوریک برنامه نویسی کاربردی در Hy را بسیار مختصر و آسان می کند
خواندن.
ماکرو آنافوریک نوعی ماکرو برنامه نویسی است که عمداً شکلی را به تصویر می کشد
به کلان ارائه می شود که ممکن است با یک آنافور (یک عبارت اشاره دارد
به دیگری). - ویکیپدیا (http://en.wikipedia.org/wiki/Anaphoric_macro)

ماکرو
ap-if
طریقه استفاده: (ap-if (فو) (چاپ آی تی))

اولین شکل را برای صدق ارزیابی می کند و آن را به آن متصل می کند it هم در راست و هم در باطل
شاخه ها.

هر کدام
طریقه استفاده: (هر کدام [1 2 3 4 5] (چاپ آی تی))

فرم مربوط به هر عنصر در لیست را از نظر عوارض جانبی ارزیابی کنید.

ap-her-while
طریقه استفاده: (ap-her-while فهرست پیش بدن)

فرم را برای هر عنصری که شکل محمول برمی‌گرداند، ارزیابی کنید درست.

=> (ap-each-while [1 2 3 4 5 6] (< آن 4) (آن را چاپ کنید))
1
2
3

ap-map
طریقه استفاده: (ap-map فرم لیست)

شکل آنافوریک نقشه دقیقاً مانند نقشه معمولی کار می کند با این تفاوت که به جای یک تابع
شیء شکل Hy به خود می گیرد. نام خاص it به شی فعلی از
لیست در تکرار

=> (لیست (ap-map (* it 2) [1 2 3]))
[2، 4، 6]

ap-map-when
طریقه استفاده: (ap-map-when predfn هرزه لیست)

با استفاده از یک تابع محمول، یک نگاشت را روی لیست ارزیابی کنید تا زمان اعمال آن را تعیین کنید
فرم.

=> (لیست (ap-map-وقتی فرد است؟ (* آن 2) [1 2 3 4]))
[2 ، 2 ، 6 ، 4]

=> (لیست (ap-map-وقتی زوج؟ (* it 2) [1 2 3 4]))
[1 ، 4 ، 3 ، 8]

ap-filter
طریقه استفاده: (ap-filter فرم لیست)

همانطور که با ap-map ما به جای یک تابع، یک فرم خاص برای فیلتر کردن عناصر می گیریم
فهرست نام خاص it به عنصر فعلی در تکرار مقید است.

=> (لیست (ap-filter (> (* it 2) 6) [1 2 3 4 5]))
[4، 5]

ap-reject
طریقه استفاده: (ap-reject فرم لیست)

این تابع برعکس عمل می کند ap-filter، عناصر عبوری را رد می کند
محمول . نام خاص it به عنصر فعلی در تکرار مقید است.

=> (لیست (ap-reject (> (* it 2) 6) [1 2 3 4 5]))
[1، 2، 3]

ap-dotimes
استفاده (ap-dotimes n بدن)

این عملکرد بدن را ارزیابی می کند n بار، با متغیر ویژه it مقید از 0 به
1-n. برای عوارض جانبی مفید است.

=> (setv n [])
=> (ap-dotimes 3 (.append n it))
=> n
[0، 1، 2]

ap-first
استفاده (ap-first predfn لیست)

این تابع اولین عنصری را که از گزاره یا عبور می کند برمی گرداند هیچ، با
متغیر ویژه it به عنصر فعلی در تکرار محدود می شود.

=> (ap-first (> it 5) (محدوده 10))
6

ap-last
استفاده (آخرین predfn لیست)

این تابع آخرین عنصری را که از گزاره یا عبور می کند، برمی گرداند هیچ، با خاص
متغیر it به عنصر فعلی در تکرار محدود می شود.

=> (ap-last (> it 5) (محدوده 10))
9

ap-reduce
استفاده (ap-reduce فرم فهرست &اختیاری مقدار اولیه)

این تابع نتیجه اعمال فرم را به 2 عنصر اول بدن و
استفاده از نتیجه و عنصر 3 و غیره تا زمانی که لیست تمام شود. به صورت اختیاری
مقدار اولیه را می توان عرضه کرد بنابراین تابع به مقدار اولیه و مقدار اعمال می شود
در عوض عنصر اول این عنصر در حال تکرار به عنوان آشکار می شود it و جریان
ارزش انباشته شده به عنوان ACC.

=> (ap-reduce (+ it acc) (محدوده 10))
45

حلقه/عود
جدید در نسخه 0.10.0.

La حلقه / تجدید حیات ماکرو به برنامه نویسان راه ساده ای برای استفاده از بهینه سازی tail-call (TCO) می دهد.
در کد Hy خود.
فراخوانی دم یک فراخوانی زیر روال است که در داخل رویه دیگری به عنوان نهایی آن اتفاق می افتد
عمل؛ ممکن است مقدار بازگشتی تولید کند که بلافاصله توسط فراخوان بازگردانده می شود
روش. اگر هر فراخوانی که یک زیربرنامه انجام دهد، به گونه ای که ممکن است در نهایت منجر شود
به همین زیربرنامه که دوباره در زنجیره تماس فراخوانی می شود، در موقعیت دم است،
گفته می شود که چنین زیربرنامه ای tail-recursive است که یک مورد خاص از بازگشت است.
فراخوانی های دم بسیار مهم هستند زیرا می توانند بدون افزودن یک پشته جدید اجرا شوند
فریم به پشته تماس. بیشتر چارچوب روش فعلی مورد نیاز نیست
بیشتر، و می توان آن را با فریم تماس دم جایگزین کرد. سپس برنامه می تواند پرش کند
به زیربرنامه فراخوانی شده تولید چنین کدی به جای یک توالی تماس استاندارد است
به نام حذف تماس دم یا بهینه سازی دم فراخوانی. حذف تماس دم اجازه می دهد
رویه در موقعیت دم را فراخوانی می کند تا به اندازه دستورات goto کارآمد اجرا شود.
بنابراین امکان برنامه ریزی ساختاریافته کارآمد را فراهم می کند. - ویکیپدیا (-
http://en.wikipedia.org/wiki/Tail_call)

ماکرو
حلقه
حلقه یک نقطه بازگشت ایجاد می کند. با حلقه, تجدید حیات متغیرهای تنظیم شده در را دوباره بایند می کند
نقطه بازگشتی و اجرای کد را به آن نقطه بازگشتی ارسال می کند. اگر تجدید حیات در مورد استفاده می شود
یک موقعیت غیر دم، یک استثنا پرتاب می شود.

طریقه استفاده: (حلقه پیوستگی &باقی مانده بدن)

مثال:

(نیاز به hy.contrib.loop)

(تعیین فاکتوریل [n]
(حلقه [[in] [acc 1]]
(اگر (صفر؟ i)
ACC
(تکرار (dec i) (* accc i)))))

(فاکتوریل 1000)

دفمولتی
جدید در نسخه 0.10.0.

دفمولتی به شما امکان می دهد یک تابع را با تعداد ارگ و/یا کوارگ معین بارگذاری کنید.
با الهام از برداشت Clojure تعریف کنید.

=> (نیاز به hy.contrib.multi)
=> (بسیار سرگرم کننده
... ([a] "a")
... ([ab] "ab")
... ([abc] "abc"))
=> (سرگرم کننده 1)
"یک"
=> (سرگرم کننده 1 2)
"ab"
=> (سرگرم کننده 1 2 3)
"abc"

هک ON HY


پیوستن ما هیو!
لطفا بیا هک Hy!

لطفا بیایید با ما سر بزنید #هی on irc.freenode.net!

لطفا در مورد آن در توییتر با #هی هشتگ!

لطفا در مورد آن وبلاگ!

لطفاً آن را روی حصار همسایه خود اسپری نکنید (بدون درخواست زیبا)!

هک!
این کار را انجام دهید:

1 ایجاد یک مجازی محیط:

$ virtualenv venv

و آن را فعال کنید:

دلار venv/bin/activate

یا استفاده کنید virtualenvwrapper برای ایجاد و مدیریت محیط مجازی خود:

$ mkvirtualenv hy
$ workon hy

2. کد منبع را دریافت کنید:

$ git clone https://github.com/hylang/hy.git

یا از چنگال خود استفاده کنید:

$ git کلون [ایمیل محافظت شده]: /hy.git

3. برای هک نصب کنید:

$ cd hy/
$ pip install -e .

4. سایر الزامات توسعه را نصب کنید:

$ pip install -r requirements-dev.txt

5. کارهای عالی انجام دهید. کسی را وادار به فریاد زدن از خوشحالی/انزجار از کاری که شما انجام داده اید.

تست!
تست ها در آزمایشات /. ما استفاده می کنیم بینی.

برای اجرای آزمایشات:

$ تست بینی

تست ها را بنویسید --- تست ها خوب هستند!

همچنین، خوب است که آزمایش‌ها را برای تمام پلتفرم‌های پشتیبانی شده و مطابق با PEP 8 اجرا کنید
کد شما می توانید این کار را با اجرای Tox انجام دهید:

دلار سم

سند!
اسناد در واقع شده است اسناد/. ما استفاده می کنیم مجسمه ابوالهول.

برای ساخت اسناد در HTML:

اسناد سی دی $
$ ساخت html

نوشتن اسناد --- اسناد خوب هستند! حتی این دکتر!

مشارکت کننده
از مشارکت‌ها استقبال می‌شود و بسیار قدردانی می‌شود، هر ذره کوچکی به ساخت Hy بیشتر کمک می‌کند
عالی.

درخواست های کشش عالی هستند! ما آنها را دوست داریم؛ در اینجا یک راهنمای سریع وجود دارد:

· مخزن را فورک کنید و یک شاخه موضوع برای یک ویژگی/رفع ایجاد کنید. از ایجاد تغییرات مستقیم خودداری کنید
در شعبه اصلی

· تمامی ویژگی های ورودی باید با تست همراه باشد.

· قبل از ارسال یک PR، لطفاً تست ها را اجرا کنید و کد خود را مطابق با سبک بررسی کنید
راهنما. می توانید هر دوی این کارها را همزمان انجام دهید:

دلار بسازد

· تعهدات را در واحدهای منطقی ایجاد کنید، به طوری که ردیابی و پیمایش بعدا آسان تر شود. قبل از
با ارسال یک PR، سعی کنید commit ها را به مجموعه تغییراتی تبدیل کنید که بازگشت به آن آسان است
بعد. همچنین، مطمئن شوید که فضای سفید جعلی را در تنظیمات تغییر ندهید. این
از ایجاد commit های تعمیر فضای خالی بعداً جلوگیری می کند.

· در مورد پیام های commit، سعی کنید موارد زیر را رعایت کنید:

· سعی کنید به محدودیت 50 کاراکتری برای خط اول پیام های Git commit پایبند باشید.

· برای جزئیات/توضیحات بیشتر، این را با یک خط خالی دنبال کنید و ادامه دهید
commit را با جزئیات شرح می دهد.

· در نهایت، خود را به فایل AUTHORS (به عنوان یک تعهد جداگانه) اضافه کنید: شما شایسته آن هستید :)

· تمام تغییرات دریافتی باید توسط 2 عضو مختلف از تیم اصلی Hylang تایید شود.
به وضوح از بررسی اضافی استقبال می شود، اما ما به حداقل 2 علامت برای هر کدام نیاز داریم
را تغییر دهید.

· اگر یکی از اعضای اصلی در حال ارسال پیام روابط عمومی است، لطفاً 2 عضو اصلی را پیدا کنید که شامل آن نمی شود
ارسال کننده روابط عمومی ایده در اینجا این است که می توان با نویسنده روابط عمومی کار کرد، و دومی پاسخ می دهد
کل مجموعه تغییر

· برای اسناد و سایر تغییرات بی اهمیت، خوب است که پس از یک ACK ادغام شویم. ما داریم
پوشش کم است، بنابراین عالی است که این مانع را کم نگه دارید.

هسته تیم
تیم اصلی توسعه Hy متشکل از توسعه دهندگان زیر است:

· جولیان دانجو

· مورتن لیندرود

· J کنت پادشاه

· گرگوری ناجی

· تووکا تورتو

· کارن روستاد

· آبیشک L

· کریستوفر آلن وببر

· کنراد هینسن

· اراده کان-گرین

· پل تالیامونته

· نیکولا داندریمونت

· شاقول تولبرت

· BERKER پکساگ

· کلینتون N. دریسباخ

· هان سماج

با استفاده از خدمات onworks.net از hy آنلاین استفاده کنید


سرورها و ایستگاه های کاری رایگان

دانلود برنامه های ویندوز و لینوکس

  • 1
    NSIS: Nullsoft Scriptable Install System
    NSIS: Nullsoft Scriptable Install System
    NSIS (نصب اسکریپت پذیر Nullsoft
    System) یک منبع باز حرفه ای است
    سیستم برای ایجاد نصب کننده های ویندوز. آی تی
    طراحی شده است به عنوان کوچک و انعطاف پذیر
    همانطور که ممکن است ...
    دانلود 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 و
    homebrew در Wii و WiiU...
    USBLoaderGX را دانلود کنید
  • 6
    فایر فاکس
    فایر فاکس
    Firebird RDBMS ویژگی های ANSI SQL را ارائه می دهد
    و روی لینوکس، ویندوز و اجرا می شود
    چندین پلتفرم یونیکس امکانات
    همزمانی و عملکرد عالی
    & قدرت...
    Firebird را دانلود کنید
  • بیشتر "

دستورات لینوکس

Ad