ZuriHac: hoʻomaʻamaʻa hoʻolālā hana

I Iune o kēia makahiki, ma ke kūlanakauhale liʻiliʻi Swiss o Rapperswil, kahi hanana i kapa ʻia ZuriHac. I kēia manawa ua hōʻuluʻulu ʻia ʻoi aku ma mua o ʻelima haneli Haskell ipo, mai ka poʻe hoʻomaka a hiki i nā mākua hoʻokumu o ka ʻōlelo. ʻOiai ua kapa nā mea hoʻonohonoho i kēia hanana he hackathon, ʻaʻole ia he hālāwai kūkā a i ʻole hackathon ma ke ʻano maʻamau. He ʻokoʻa kona ʻano mai nā polokalamu polokalamu kahiko. Ua aʻo mākou e pili ana iā ZuriHac ma o ka laki, ua komo i loko, a i kēia manawa ke manaʻo nei mākou he kuleana mākou e haʻi e pili ana i ka ʻike maʻamau!

ZuriHac: hoʻomaʻamaʻa hoʻolālā hana

No mākou

Ua hoʻomākaukau ʻia kēia ʻatikala e ʻelua mau haumāna 3rd makahiki o ka papahana "Applied Mathematics and Informatics" ma ke kula kiʻekiʻe o ka National Research University of Economics - St. Petersburg: Vasily Alferov lāua ʻo Elizaveta Vasilenko. Ua hoʻomaka ka makemake i ka hoʻolālā hana no mākou ʻelua me nā ʻōlelo aʻo a D. N. Moskvin i ka makahiki ʻelua o ke kulanui. Ke komo nei ʻo Vasily i kēia manawa i ka papahana Google Summer of Code, kahi e hoʻokō ai ʻo ia i nā kiʻi algebraic ma Haskell ma lalo o ke alakaʻi ʻana a ka hui papahana. Alga. Ua hoʻohana ʻo Elizaveta i nā mākau hoʻolālā hana i loaʻa i ka hana papa i hoʻolaʻa ʻia i ka hoʻokō ʻana i ka algorithm anti-unification me ka noi hope ʻana i ke ʻano ʻano ʻano.

ʻAno hanana

ʻO ka poʻe i manaʻo ʻia he poʻe nona nā papahana open source, nā polokalamu polokalamu e makemake e komo i kā lākou hoʻomohala ʻana, nā mea noiʻi hoʻolālā hana, a me nā poʻe makemake nui iā Haskell. I kēia makahiki, ua hōʻuluʻulu nā mea hoʻomohala mai nā papahana Haskell he kanalima ākea mai nā wahi a pau ma ke kahua - ka HSR Hochschule für Technik Rapperswil - e kamaʻilio e pili ana i kā lākou huahana a loaʻa i nā poʻe hou e hoihoi i kā lākou ulu ʻana.

ZuriHac: hoʻomaʻamaʻa hoʻolālā hana

Kiʻi mai Twitter ZuriHac

He maʻalahi loa ka papahana: pono ʻoe e kākau i kekahi mau manaʻo e pili ana i kāu papahana ma mua a hoʻouna iā lākou i nā mea hoʻonohonoho, nāna e kau i ka ʻike e pili ana i kāu papahana ma ka ʻaoʻao hanana. Eia kekahi, ma ka lā mua, he kanakolu kekona nā mea kākau o nā papahana e haʻi pōkole loa mai ke kahua i kā lākou hana a me nā mea e pono ai ke hana. A laila ʻimi ka poʻe hoihoi i nā mea kākau a nīnau kikoʻī e pili ana i nā hana.

ʻAʻole loaʻa kā mākou mau papahana wehe, akā makemake maoli mākou e hāʻawi i nā mea i loaʻa, no laila ua hoʻopaʻa inoa mākou ma ke ʻano he poʻe komo maʻamau. I loko o nā lā ʻekolu, ua hana mākou me ʻelua pūʻulu o nā mea hoʻomohala. ʻIke ʻia ʻo ka hoʻopaʻa ʻana i ka code a me ke kamaʻilio ola e hoʻohua nui ai ka pilina ma waena o nā mea kākau papahana a me nā mea kōkua - ma ZuriHac ua hiki iā mākou ke hoʻomaopopo i nā wahi hou iā mākou a hiki iā mākou ke kōkua i ʻelua mau hui like ʻole, hoʻopau i hoʻokahi hana i kēlā me kēia. o na papahana.

Ma waho aʻe o ka hoʻomaʻamaʻa koʻikoʻi, ua hāʻawi ʻia kekahi mau haʻiʻōlelo a me nā papa haku ma ZuriHac. Hoʻomanaʻo nui mākou i ʻelua mau haʻiʻōlelo. I ka mua o lākou, ua kamaʻilio ʻo Andrey Mokhov mai ke Kulanui o Newcastle e pili ana i nā mea hoʻohana koho koho - he papa o nā ʻano e lilo i waena ma waena o nā mea hana noiʻi a me nā monads. Ma kekahi haʻi'ōlelo, ua kamaʻilio kekahi o nā mea nāna i hoʻokumu iā Haskell, ʻo Simon Peyton Jones, e pili ana i ka hana ʻana o ke ʻano inference i ka GHC compiler.

ZuriHac: hoʻomaʻamaʻa hoʻolālā hana

Haʻiʻōlelo na Simon Peyton Jones. Kiʻi mai Twitter ZuriHac

Ua māhele ʻia nā papa haku i ka hackathon i ʻekolu mau ʻāpana e like me ke kiʻekiʻe o ke aʻo ʻana o nā mea komo. Ua hōʻailona pū ʻia nā hana i hāʻawi ʻia i nā poʻe i komo i ka hoʻomohala ʻana i nā papahana me kahi pae paʻakikī. Hoʻokipa hauʻoli ke kaiāulu liʻiliʻi akā aloha o nā mea papahana hana i nā poʻe hou i loko o kona mau kūlana. No ka hoʻomaopopo ʻana i nā haʻiʻōlelo a Andrei Mokhov lāua ʻo Simon Peyton Jones, akā naʻe, ua pono loa ka papa hoʻolālā hana a mākou i lawe ai ma ke kulanui.

He manuahi ke kākau inoa ʻana no ka hanana no nā mea komo maʻamau a me nā mea kākau papahana. Ua hoʻouna mākou i nā noi no ke komo ʻana i ka hoʻomaka ʻana o Iune, a ma hope iho ua hoʻoneʻe koke ʻia mākou mai ka papa inoa kali i ka papa inoa o nā mea komo.

A i kēia manawa e kamaʻilio mākou e pili ana i nā papahana i ka hoʻomohala ʻana a mākou i komo ai.

ʻO Pandoc

ʻO Pandoc he mea hoʻololi holoʻokoʻa o nā palapala kikokikona, ʻoiaʻiʻo, mai kekahi ʻano i kekahi. No ka laʻana, mai docx a i pdf, a mai Markdown a i MediaWiki. ʻO kāna mea kākau, ʻo John MacFarlane, he kumu aʻoaʻo no ke akeakamai ma ke Kulanui o Kaleponi, Berkeley. Ma keʻano laulā, kaulana loa ʻo Pandoc, a ua kāhāhā kekahi o kā mākou mau hoaaloha i ko lākou ʻike ʻana ua kākau ʻia ʻo Pandoc ma Haskell.

ZuriHac: hoʻomaʻamaʻa hoʻolālā hana

Papa inoa o nā ʻano palapala i kākoʻo ʻia e Pandoc. Aia kekahi pakuhi holoʻokoʻa ma ka pūnaewele, akā ʻaʻole kūpono kēia kiʻi i ka ʻatikala.

ʻOiaʻiʻo, ʻaʻole hāʻawi ʻo Pandoc i ka hoʻololi pololei ʻana no kēlā me kēia pālua o nā ʻano. No ke kākoʻo ʻana i nā ʻano hoʻololi like ʻole, hoʻohana ʻia kahi hoʻoponopono hoʻolālā maʻamau: ʻo ka mea mua, ua unuhi ʻia ka palapala holoʻokoʻa i loko o kahi hōʻike kikowaena kūloko kūikawā, a laila hana ʻia kahi palapala ma kahi ʻano ʻokoʻa mai kēia hōʻike kūloko. Kapa nā mea hoʻomohala i ka hōʻike kūloko "AST", kahi e kū nei no Abstract Syntax Tree, a i ʻole lāʻau syntax abstract. Hiki iā ʻoe ke nānā maʻalahi i ka hōʻike waena: ʻo nā mea a pau āu e hana ai, ʻo ka hoʻonohonoho ʻana i ke ʻano hoʻopuka i ka "native"

$ cat example.html
<h1>Hello, World!</h1>

$ pandoc -f html -t native example.html
[Header 1 ("hello-world",[],[]) [Str "Hello,",Space,Str "World!"]]

ʻO ka poʻe heluhelu i hana pū me Haskell ma kahi liʻiliʻi liʻiliʻi hiki ke manaʻo mai kēia hiʻohiʻona liʻiliʻi ua kākau ʻia ʻo Pandoc ma Haskell: ʻo ka hoʻopuka ʻana o kēia kauoha he hōʻailona string o nā hale kūloko o Pandoc, i hana ʻia e like me ke ʻano o ka hana maʻamau. ma Haskell, no ka laʻana, ma ka waihona maʻamau.

No laila, maʻaneʻi hiki iā ʻoe ke ʻike he ʻano recursive ka hōʻike kūloko, i kēlā me kēia node kūloko kahi papa inoa. No ka laʻana, aia ma ka pae kiʻekiʻe he papa inoa o hoʻokahi mea - ke poʻo pae mua me nā ʻano "hello-world",[],[]. Huna i loko o kēia poʻomanaʻo he papa inoa o ke kaula "Aloha," a ukali ʻia e kahi hakahaka a me ke kaula "World!".

E like me kāu e ʻike ai, ʻaʻole ʻokoʻa ka hōʻike kūloko mai HTML. He lāʻau ia kahi e hāʻawi ai kēlā me kēia node kūloko i kekahi mau ʻike e pili ana i ke ʻano o kāna mau mamo, a aia i loko o nā lau nā mea maoli o ka palapala.

Inā mākou e iho i ka pae hoʻokō, wehewehe ʻia ke ʻano ʻikepili no ka palapala holoʻokoʻa e like me kēia:

data Pandoc = Pandoc Meta [Block]

Eia ʻo Block ka pololei o nā vertices kūloko i ʻōlelo ʻia ma luna, a ʻo Meta ka metainformation e pili ana i ka palapala, e like me ke poʻo inoa, ka lā hana, nā mea kākau - ʻokoʻa kēia no nā ʻano like ʻole, a hoʻāʻo ʻo Pandoc, inā hiki, e mālama i kēlā ʻike i ka unuhi ʻana mai ka ʻano hōʻano.

Aneane nā mea kūkulu hale o ke ʻano Block - no ka laʻana, Header a i ʻole Para (palaka) - lawe i nā ʻano a me kahi papa inoa o nā vertices haʻahaʻa haʻahaʻa e like me nā hoʻopaʻapaʻa - Inline, ma ke ʻano he lula. No ka laʻana, ʻo Space a i ʻole Str nā mea kūkulu o ke ʻano Inline, a ua huli pū ka tag HTML i kāna Inline kūikawā. ʻAʻole mākou e ʻike i kahi kikoʻī o ka hāʻawi ʻana i kahi wehewehe piha o kēia mau ʻano, akā e hoʻomaopopo ʻoe hiki ke loaʻa ma aneʻi maanei.

ʻO ka mea hoihoi, ʻo ke ʻano Pandoc he monoid. ʻO ia hoʻi, aia kekahi ʻano palapala ʻole, a hiki ke hoʻopaʻa ʻia nā palapala. He mea maʻalahi kēia e hoʻohana i ka wā e kākau ai i nā mea heluhelu - hiki iā ʻoe ke wāwahi i kahi palapala i mau ʻāpana me ka hoʻohana ʻana i ka loina ʻokoʻa, e hoʻokaʻawale i kēlā me kēia, a laila e hoʻohui i nā mea āpau i hoʻokahi palapala. I kēia hihia, e hōʻiliʻili ʻia ka metainformation mai nā ʻāpana āpau o ka palapala i ka manawa hoʻokahi.

I ka hoʻololi ʻana, e ʻōlelo, mai LaTeX i HTML, hoʻololi mua kahi module kūikawā i kapa ʻia ʻo LaTeXReader i ka palapala hoʻokomo i AST, a laila hoʻololi kekahi module i kapa ʻia HTMLWriter i ka AST i HTML. Mahalo i kēia hoʻolālā, ʻaʻohe pono e kākau i kahi helu quadratic o nā hoʻololi - ua lawa ke kākau ʻana i ka Mea Heluhelu a me ka Mea kākau no kēlā me kēia ʻano hou, a e kākoʻo ʻia nā palua hiki ke hoʻololi ʻia.

He mea maopopo loa he mau hemahema no ia ano, i wanana mua ia e ka poe akamai i ka hana o ka lako polokalamu. ʻO ka mea nui loa ke kumukūʻai o ka hoʻololi ʻana i ka lāʻau syntax. Inā koʻikoʻi ka hoʻololi, pono ʻoe e hoʻololi i ke code ma nā mea heluhelu a me nā mea kākau. No ka laʻana, ʻo kekahi o nā paʻakikī e kū nei i nā mea hoʻomohala Pandoc ke kākoʻo nei i nā ʻano papaʻaina paʻakikī. I kēia manawa hiki iā Pandoc ke hana i nā papa maʻalahi loa, me ke poʻo, nā kolamu a me kahi waiwai i kēlā me kēia cell. No ka laʻana, e nānā ʻole ʻia ke ʻano colspan ma HTML. ʻO kekahi kumu o kēia ʻano, ʻo ia ka nele o kahi hoʻolālā lokahi no ka hōʻike ʻana i nā papa ma nā ʻano āpau a i ʻole ka liʻiliʻi loa - no laila, ʻaʻole maopopo i ke ʻano o ka mālama ʻana i nā papa i loko o ka hōʻike kūloko. Akā ma hope o ke koho ʻana i kahi ʻike kikoʻī, pono ʻoe e hoʻololi i nā mea heluhelu a me nā mea kākau āpau e kākoʻo ana i ka hana ʻana me nā papa.

Ua koho ʻia ka ʻōlelo Haskell ʻaʻole wale no ke aloha nui o nā mea kākau i ka hoʻolālā hana. Ua ʻike ʻia ʻo Haskell no kāna hiki ke hana kikokikona. ʻO kekahi laʻana ka hale waihona puke parsec He hale waihona puke e hoʻohana ikaika ana i nā manaʻo o ka hoʻolālā hana - monoids, monads, applicative a me nā mea hana ʻē aʻe - e kākau i nā parser arbitrary. Hiki ke ʻike ʻia ka mana piha o Parsec ma laʻana mai HaskellWiki, kahi i hoʻopau ʻia ai kahi parser piha o kahi ʻōlelo hoʻonohonoho maʻalahi. ʻOiaʻiʻo, hoʻohana ikaika ʻia ʻo Parsec ma Pandoc.

I wehewehe pōkole ʻia, hoʻohana ʻia nā monads no ka parsing sequential, ke hele mua kekahi mea, a laila kekahi. No ka laʻana, ma kēia laʻana:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Pono mua ʻoe e helu i ka hakahaka, a laila ka ʻōlelo - aia pū kekahi ʻano Parser Stmt.

Hoʻohana ʻia nā mea hana ʻē aʻe e hoʻihoʻi i hope inā ʻaʻole hiki ke hoʻopau ʻia. ʻo kahi laʻana,

statement :: Parser Stmt
statement = parens statement <|> sequenceOfStmt

ʻO ia hoʻi, pono ʻoe e hoʻāʻo e heluhelu i ka ʻōlelo i loko o nā brackets, a i ʻole e hoʻāʻo e heluhelu i kekahi mau ʻōlelo ma ke kaʻina.

Hoʻohana mua ʻia nā mea hana applicative e like me nā pōkole no nā monads. No ka laʻana, e heluhelu ka hana tok i kekahi hōʻailona (he hana maoli kēia mai LaTeXReader). E nānā kākou i kēia hui ʻana

const <$> tok <*> tok

E heluhelu ia i ʻelua hōʻailona ma ka lālani a hoʻihoʻi i ka mea mua.

No kēia mau papa a pau, loaʻa iā Haskell nā mea hōʻailona hōʻailona nani, e hoʻohālikelike ai ka polokalamu Reader e like me ke kiʻi ASCII. Mahalo wale i kēia code maikaʻi.

Ua pili kā mākou mau hana iā LaTeXReader. ʻO ka hana a Vasily ke kākoʻo i nā kauoha mbox a me hbox, pono no ke kākau ʻana i nā pūʻolo ma LaTeX. ʻO Elizabeth ke kuleana no ke kākoʻo ʻana i ke kauoha epigraph, kahi e hiki ai iā ʻoe ke hana i nā epigraphs ma nā palapala LaTeX.

Hatrace

Hoʻokomo pinepine nā ʻōnaehana hana UNIX i ka ptrace system call. He mea pono ia i ka debugging a me ka hoʻohālikelike ʻana i nā kaiapuni papahana, e ʻae iā ʻoe e ʻimi i nā kelepona ʻōnaehana i hana ʻia e ka papahana. No ka laʻana, hoʻohana ka strace pono loa i ka ptrace i loko.

He hale waihona puke ʻo Hatrace e hāʻawi i kahi kikowaena e hoʻopaʻa inoa ma Haskell. ʻO ka ʻoiaʻiʻo, ʻo ka ptrace ponoʻī he maʻalahi loa a paʻakikī loa ka hoʻohana pololei ʻana, ʻoi aku ka nui o nā ʻōlelo hana.

Holo ʻo Hatrace e like me strace i ka hoʻomaka ʻana a ʻae i nā manaʻo like. He ʻokoʻa ia mai ka strace no ka mea he hale waihona puke ia e hāʻawi i kahi maʻalahi maʻalahi ma mua o ka ptrace wale nō.

Me ke kōkua o ka hatrace, ua loaʻa iā mākou kekahi mea ʻoluʻolu ʻole i ka GHC Haskell compiler - ke pepehi ʻia i ka manawa kūpono ʻole, hana ia i nā faila hewa ʻole a ʻaʻole e hoʻopili hou iā lākou ke hoʻomaka hou. ʻO ka hoʻopaʻa ʻana ma nā kelepona ʻōnaehana i hiki ai ke hoʻopuka pono i ka hewa i ka holo hoʻokahi, ʻoiai ua hoʻopuka ka pepehi kanaka i ka hewa i loko o ʻelua mau hola.

Ua hoʻohui mākou i nā kikowaena kelepona pūnaewele i ka waihona - ua hoʻohui ʻo Elizaveta i ka brk, a ua hoʻohui ʻo Vasily i mmap. Ma muli o nā hopena o kā mākou hana, hiki ke hoʻohana maʻalahi a pololei i nā manaʻo o kēia mau kelepona pūnaewele i ka wā e hoʻohana ai i ka waihona.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka