рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрдХреНрддрд┐ рд░рд╡рд┐рд╡рд╛рд░ рдХреА рд╕реБрдмрд╣ рдардВрдб рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛: рд░рд╡рд┐рд╡рд╛рд░ рдХреА рд╕реБрдмрд╣ рдардВрдб рдореЗрдВ, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕реЛ рд░рд╣рд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдиреЗ рдкреВрд░реЗ рд╣рдлреНрддреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЖрд░рд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рд░рд╡рд┐рд╡рд╛рд░ рдХреА рд╕реБрдмрд╣ рдардВрдб рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдардВрдбреА рд░рд╡рд┐рд╡рд╛рд░ рдХреА рд╕реБрдмрд╣, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧрд░реНрдо рдЪрд╛рдп рдкреАрддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИред рд╡рд╣ рдЪрд╛рдп рдкреАрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реБрдмрд╣ рдХреА рдардВрдб рд╣реИ, рдФрд░ рд╡рд╣ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЙрдард╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣рдореЗрд╢рд╛ рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рдиреЛрдВ рдореЗрдВ рд╡рд╣ рдкреИрд╕реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╕реЗ рдмрд╣реБрдд рдердХ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЦреБрдж рдХреЗ рд▓рд┐рдП рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдкрд░, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рдЖрд░рд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЖрдЬ рд╕реБрдмрд╣ рд╣рдо Ocsigen рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдЖрд╡реЗрджрди рд▓рд┐рдЦреЗрдВрдЧреЗред рдЬреЛ рд▓реЛрдЧ рдпрд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рд▓реЗ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдореИрдиреБрдЕрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЛ рдмрд╣реБрдд рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореИрдиреБрдЕрд▓ рдЕрдзреВрд░рд╛ рд╣реИ, рд╡рд┐рдХреГрдд рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рднрд░рд╛ рд╣реБрдЖ рд╣реИ рд▓рд╛ "??????" рдФрд░ рдлреНрд░реЗрдВрдЪ рдореЗрдВ рдмреЗрдИрдорд╛рдиреА рднрд╛рд╖рд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдореБрдЦреНрдп рдореИрдиреБрдЕрд▓ рд░рд╣реВрдВрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реЛрдЧрд╛, рд╣рдордиреЗ рдПрдХ рдмрд╛рд░ рдпреЛрдмрд╛ рднрд╛рд╖рд╛
рдХреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░ рдХреЛ
рд▓рд┐рдЦрд╛ рдерд╛ ред рддрдм рд╕реЗ, рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрди рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓рд╛рдЗрди рджреЗ (рдмрдЬрд╛рдп рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ)ред рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рдо
рдпреЛрдмрд╛ рдХреЛ Google рдХреА рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
, рдпреЛрдмрд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрджрд▓рдирд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝рд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЕрдбрд╝рд┐рдпрд▓ рди рдмрди рдЬрд╛рдКрдВ, рдпрд╣ рд╕рдм рд╕рдорд╛рди рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдЦрд░реНрдЪ рдХрд░рдиреЗ рджреЗрдВ, рди рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ ocsigen рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ 2.0 рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо
рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЕрдкрдиреЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдмрдВрдбрд▓ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдВрдбрд▓ рдХреЛ рд╕рд╣реА рдФрд░ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, Makefile.config рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд▓рд┐рдЦреЗрдВ:
LOCAL := ${HOME}/bin/ocsigen
DEV := YES
OCAMLDUCE := YES
OCLOSURE := YES
OTHERS := YES
Ocaml рдФрд░ Findlib рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░ рд╣рдореЗрдВ рдУ'рдХреНрд▓реЛрдЬрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ - рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╣рдореЗрдВ рдСрдХреНрд╕реАрдЬрди рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рди рдХрд░рдирд╛ рдкрдбрд╝реЗ, рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдореБрдЭрд╕реЗ рдПрдХ рд▓реЗрдЦ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреБрд░рдВрдд рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ $ {HOME} /bin/ocsigen/etc/ocsigranever/ocsigctorver.conf: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЙрдкрдпреБрдХреНрдд рдкреЛрд░реНрдЯ рд╡рд╣рд╛рдБ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдирд╛рдо рдФрд░ рд╕рдореВрд╣ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рдЕрдм рднрд╡рд┐рд╖реНрдп рдХреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред $ {HOME} /bin/ocsigen/etc/ocsigctorver/conf.d/yoba.conf рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА рд╕реЗ рднрд░реЗрдВ:
<ocsigen> <server> <charset>utf-8</charset> <extension findlib-package="ocsigenserver.ext.staticmod"/> <extension findlib-package="ocsigenserver.ext.ocsipersist-sqlite"> <database file="ocsidb"/> </extension> <extension findlib-package="ocsigenserver.ext.deflatemod" /> <extension findlib-package="eliom.server"/> <host charset="utf-8" hostfilter="*"> <site path="" charset="utf-8"> <static dir="/home/username/yoba" /> <eliom module="/home/username/yoba/_build/server/yoba.cmo"> <cache-size>10000</cache-size> </eliom> </site> <deflate compress="only"> <type>application/x-javascript</type> </deflate> </host> </server> </ocsigen>
рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
- staticmod рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рд┐рдд .js рдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧреА
- ocsipersist-sqlite - рд╣рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
- рдбрд┐рдлреНрд▓реЗрдореЗрдЯрдо, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ, рдЬрдм рдЗрд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдбреЗрдЯрд╛ рджрдмрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рдЖрдк рд╕рд╛рдЗрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдбрд┐рдлреНрд▓реЗрдЯ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ js рджрдмрд╛рддреЗ рд╣реИрдВред рдиреЛрдЯ: рдЖрдк рд╕рдВрдкреАрдбрд╝рди рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - gzip рдпрд╛ рдЕрдкрд╕реНрдлреАрддрд┐ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдХреА рдЙрдореНрдореАрджреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред
- eliom.server рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдкреВрд░рд╛ рд╕рд░реНрд╡рд░ рд╣рд┐рд╕реНрд╕рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
- рд╣рдорд╛рд░реЗ рдореЗрдЬрдмрд╛рди рдХреЗ hostfilter рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕рднреА рдбреЛрдореЗрди рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВ
- рдФрд░ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рдкрде рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реБрдП, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдЗрдЯ рдбреЛрдореЗрди рдХреЗ рд░реВрдЯ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдХреА рдЬрдЧрд╣, "рдпреЛрдмрд╛" рдХрд╣реЗрдВ, рд╣рдо рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХреЛ рд╕рднреА рд╕реНрдереИрддрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдмрд▓ рджреЗрдВрдЧреЗ рдкрддрд╛ рд╣реЛрд╕реНрдЯрдирд╛рдо / рдпреЛрдмрд╛ рдХреЛ - рдПрдХ рдЕрд╕рдВрджрд┐рдЧреНрдз рд▓рд╛рдн, рдЖрдк рдПрдХ рд╣реА рдбреЛрдореЗрди рдкрд░ рдХрдИ рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлреЗрд░рдмрджрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- / home / username / yoba рдХреЛрдб (рдФрд░ рд╕рдВрдХрд▓рд┐рдд yoba.js рдлрд╝рд╛рдЗрд▓) рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реЛрдЧреА, рдФрд░ _build / рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╕рд░реНрд╡рд░ рдореЙрдбреНрдпреВрд▓ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЕрднреА рднреА рд╕рдВрдХрд▓рд┐рдд рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред
рд╣реБрд░реНрд░реЗ! рд╣рдо рд▓реЗрдЦрди рдХреЛрдб рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред
рд╣рдо рдХреБрдЦреНрдпрд╛рдд рдлрд╝реЛрд▓реНрдбрд░ / рд╣реЛрдо / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо / рдпреЛрдмрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░
рдЖрд░реНрдХрд╛рдЗрд╡ рдХреЛ рдпреЛрдмрд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ
рд╣реИрдВ - рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рд▓рд┐рдЦреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдмрджрд▓рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рддреБрд░рдВрдд рд▓реЗ рд▓реЗрдВрдЧреЗред рд╣рдо рдЗрд╕реЗ рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрдирдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдирдХ
Makefile.config рдФрд░
Makefile.rules рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдЖрдк рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рдЕрдВрдЬреАрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рддреБрд░рдВрдд рдкрд╣рд▓реЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:
рдПрд▓рд┐рдУрдо рдореЗрдВ, рдХреЛрдб рдХреЛ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред {рд╕рд░реНрд╡рд░ {...}} рдЕрдиреБрднрд╛рдЧ (рдЕрдиреБрднрд╛рдЧ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рд╕рдорд╛рди) рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ {рдХреНрд▓рд╛рдЗрдВрдЯ {...}} рдЕрдиреБрднрд╛рдЧ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ {рд╕рд╛рдЭрд╛ {...}} рд╡рд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рджреЛрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╣реИредрдЪреВрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо yobaLang.ml рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ yobaLang.eliom рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ, рдФрд░ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд╛рдЗрди "{рдХреНрд▓рд╛рдЗрдВрдЯ {" рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдмрджрд▓реЗрдВ ";;" (рджреЛ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо - рдпрд╣ рдХреЗрд╡рд▓ рдХреЛрдб рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЕрдВрдд рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЕрдм рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) "}}"ред рдЬрдм рд╣рдо рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдЙрддреНрдкрдиреНрди рдУрдореНрд▓реЗрдХреНрд╕ рдФрд░ рдУрдХреНрдорд▓реИрдХ рдХреЛрдб рдХреЛ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдмреАрдЪ, рдПрдХ рдлрд╛рдЗрд▓ рд▓рд┐рдЦрд┐рдП рдЬреЛ рд╕рдм рдХреБрдЫ рдХрд░реЗрдЧреАред рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, home.eliomред
рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рддреБрд░рдВрдд рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рдмрдирд╛рдПрдВ рдЬреЛ рдЖрдЧрдВрддреБрдХ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
{shared{ open Eliom_pervasives open Lwt open HTML5.M open Eliom_parameters open Eliom_request_info open Eliom_output.Html5 open Ocsigen_extensions let code_example = ref " 1 2 1 50 " }}
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВрдЧреЗ - рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдУрд░ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЖрд╕рд╛рди рд╣реИ:
module My_appl = Eliom_output.Eliom_appl ( struct let application_name = "yoba" end)
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдпреЛрдм рдкрд░ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛, рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реЛрдЧрд╛, рд╕рд░реНрд╡рд░ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛
{client{ let yoba_execute str = ( let yparser = new YobaLang.yoba_interpretator () in yparser#parse str; yparser#get_output) }}
рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреАред Ocsigen рдореЗрдВ рд╕реЗрд╡рд╛рдПрдБ рдмрдирд╛рдирд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдФрд░ рдЬреЛрд░рджрд╛рд░ рдЯрд╛рдЗрдк (!) GET / POST рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕рд░реНрд╡рд░ рдЕрдиреБрд░реЛрдз рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╕реЗрд╡рд╛ рддрдп рдХрд░рддрд╛ рд╣реИред рдЖрдк рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрд╡рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреА, рдЙрд╕реА рдкрддреЗ рдкрд░ рдПрдХ рджреВрд╕рд░реА рд╕реЗрд╡рд╛ рдЬреЛ рдПрдХ рдЬреАрдИрдЯреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧреА, рдФрд░ рдПрдХ рдкреАрдУрдЯреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рддреАрд╕рд░реА рд╕реЗрд╡рд╛ред рдФрд░ рд╡реЗ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
let empty_service = Eliom_services.service ~path:[""] ~get_params:(Eliom_parameters.unit) ();;
рдкрде рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрде (рдЕрдкрд╛рдЪреЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрда рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЗ рд╕рд╛рде рджреА рдЬрд╛рдПрдЧреА, рдФрд░ ~ get_params рдореЗрдВ рд╣рдордиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рд╕реЗрд╡рд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдкреЗрдЬ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ:
let page_template code_input counter_value = html (head (title (pcdata "Yoba interpreter")) [] ) (body [ h1 [pcdata "Yoba! For human beings"]; p [pcdata " ! тАФ !"]; div [ raw_textarea ~a:[a_id "clientcode"] ~name:"clientcode" ~rows:25 ~cols:60 ~value:code_input (); raw_button ~button_type:`Button ~name:"clientbutton" ~a:[a_id "clientbutton"] ~value:"!" [pcdata "!"]; ]; pre ~a:[a_id "clientoutput"] []; hr (); p [pcdata "- : "; b [pcdata (string_of_int counter_value)]] ]);;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдкреГрд╖реНрда рддрддреНрд╡ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ рдЬреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдирд┐рд░реНрдорд┐рдд HTML рдкреГрд╖реНрда рдХрд╛ рд╕реНрдереИрддрд┐рдХ рдкреНрд░рдХрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ, html рдлрдВрдХреНрд╢рди рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдкреНрд░рдХрд╛рд░ `рд╣реЗрдб, рдФрд░ рджреВрд╕рд░рд╛ рдЯрд╛рдЗрдк` рдмреЙрдбреАред рдФрд░ div - рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА div рдХреЗ рдЕрдВрджрд░ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред
рд▓реЗрдХрд┐рди рд╣рдо рджреВрд╕рд░реЗ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░рд╛ page_template рдлрд╝рдВрдХреНрд╢рди рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдХреЛрдб рдФрд░ рдПрдХ рдЖрдЧрдВрддреБрдХ рдХрд╛рдЙрдВрдЯрд░ред рдкрд╣рд▓реЗ рдХреЛ рдЯреЗрдХреНрд╕рд╛рд░рд┐рдпрд╛ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╕рдмрд╕реЗ рдиреАрдЪреЗ <p> рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рд╣реИред рджреВрд╕рд░реЗ, рдХрдЪреНрдЪреЗ_рдЯреЗрдХреНрд╕реНрдЯреЗрд░рд┐рдпрд╛ рдФрд░ рд░реЙ_рдмрдЯрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдЗрддрдиреЗ рдХрдЪреНрдЪреЗ рд╣реИрдВ - рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдПред рд╕рдорд╛рди рд╕рд░рд▓ рдЧреИрд░- "рд░реЙ_" рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрджреНрднреБрдд, рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд░реВрдкреЛрдВ рдХреЗ рдЕрдВрджрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЬрдм рдПрдХ рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рддреБрд░рдВрдд рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╕реВрдЪреА рдХреЛ рдХрд╣рд╛рдВ рднреЗрдЬреЗрдЧрд╛ред рдкреИрд░рд╛рдореАрдЯрд░)ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдЯреЗрдХреНрд╕реНрдЯрд╛рд░рд┐рдпрд╛ рдФрд░ рдмрдЯрди (рдпрд╣ <рдЗрдирдкреБрдЯ> рдЯреИрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдЪрдЯреАрдПрдордПрд▓ 5 рд╕реЗ рд╕рдмрд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ <рдмрдЯрди> рдЯреИрдЧ) рдХрд╣реАрдВ рднреА рдХреБрдЫ рднреА рдирд╣реАрдВ рднреЗрдЬреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ рдлреНрд░реЙрдб рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЛрдИ рднреА рдлреЙрд░реНрдо рдирд╣реАрдВ рд╣реИред рддреАрд╕рд░рд╛, рд╣рдордиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ <pre> рдмрдирд╛рдпрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред
рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдореИрдВрдиреЗ рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ? рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреВрд▓ рдЧрдпрд╛, рдЪрд▓реЛ рдЗрд╕реЗ рд▓рд┐рдЦреЛред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рджреЛ рдирдП рдореЙрдбреНрдпреВрд▓: Lwt рдФрд░ Ocsipersist рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗред рдкрд╣рд▓рд╛ рд╕рд╣рдХрд╛рд░реА рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд▓рдЧрд╛рддрд╛рд░ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╣реИред
рдСрдХреНрд╕реАрдЬрди рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рдгрд╛рд▓реА рд╕рд╣рдХрд╛рд░реА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдзрд╛рдЧреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдФрд░ рдЕрдиреНрдп рдмрдХрд╡рд╛рд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рдореЗрдВ рдмрд╣реБрдд рд╣рд▓реНрдХреЗ рдзрд╛рдЧреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ (рдЗрддрдирд╛ рд╣рд▓реНрдХрд╛ рдХрд┐ рд╡реЗ рд▓рдЧрднрдЧ рд╣рд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдмрдХрд╡рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдХреЛрдб рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рдмрдирд╛рддреЗ рд╣реИрдВ рд╕рд╣рдХрд╛рд░реА рдмрд┐рдВрджреБ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдХрд▓рдХ рд╕реНрд╡рдпрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЧрддрд┐рд░реЛрдз рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
let get_count = let counter_store = Ocsipersist.open_store "counter_store" in let cthr = Ocsipersist.make_persistent counter_store "countpage" 0 in let mutex = Lwt_mutex.create () in (fun () -> cthr >>= (fun c -> Lwt_mutex.lock mutex >>= (fun () -> Ocsipersist.get c >>= (fun oldc -> let newc = oldc + 1 in Ocsipersist.set c newc >>= (fun () -> Lwt_mutex.unlock mutex; return newc) ) ) ) ) ;;
рдпрджрд┐ рдЖрдк OCaml (рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдХрд┐рдпрд╛ рдерд╛) рдХреЗ рд▓рд┐рдП рдмреЗрд╣рд┐рд╕рд╛рдм рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдореБрд╢реНрдХрд┐рд▓ рд╣реИред Get_count рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ "рдСрдмреНрдЬреЗрдХреНрдЯ" рд╣реИ рдЬреЛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдХреЛрдб рдореЗрдВ "get_count" рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рд▓реЗрддрд╛ рд╣реИ () рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдо рдлрдВрдХреНрд╢рди рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рд╣рдо рддреБрд░рдВрдд рдЯреНрд░рд┐рдХреА рдСрдкрд░реЗрдЯрд░ ">> =" рджреЗрдЦрддреЗ рд╣реИрдВ - рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ - рдереНрд░реЗрдб - рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП - рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдирдпрд╛ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИред рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
val (>>=) : 'at -> ('a -> 'bt) -> 'bt
рдФрд░ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдереНрд░реЗрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
рдСрдХреНрд╕рд┐рдкрд░реНрд╕рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рдирд╛ рд╣реИред
рд╣рдо рдЕрдкрдиреЗ get_count рдХреЛ рдХрд╣рд╛рдВ рд╕реЗ рдмреБрд▓рд╛рдПрдВрдЧреЗ рдФрд░ рдкреЗрдЬ рдХрд╛ рдЦрд╛рдХрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ? рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣ рд╣реИ, рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд╛рд░реНрдп:
let interpret code = let req = Eliom_request_info.get_ri () in let ref = match Lazy.force_val req.ri_referer with | None -> "" | Some x -> x in Ocsigen_messages.accesslog ("Referer: " ^ ref); get_count() >|= (page_template code);;
рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рддреА рд╣реИред рдСрдХреНрд╕рд┐рдЬрди, рдЕрдлрд╕реЛрд╕, рд▓реЙрдЧ рдХреЛ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдХреМрди, рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдЬреЗрдВрдЯ, рдХреМрди рд╕рд╛ рд╣реЛрд╕реНрдЯ, рдХреМрди рд╕рд╛ рдкреЗрдЬ, рдХрдмред рдФрд░ рдореИрдВ рдПрдХ рд░реЗрдлрд╝рд░ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЦреИрд░, рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрджрд╛рддрд╛ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдВрдЧреЗред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓рд╛рдХ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдПрдХ рдРрд╕рд╛ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд▓), рдФрд░ рдЬрд┐рд╕реЗ рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рднреА рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЬрдм рддрдХ рдореИрдВрдиреЗ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд┐рдпрд╛, рддрдм рддрдХ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ рдФрд░ рдирдпрд╛ рдСрдкрд░реЗрдЯрд░ "> | =" ">> =" рдХреЗ рд╕рдорд╛рди рд╣реИ - рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдХрд┐ рдереНрд░реЗрдб рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ рдереНрд░реЗрдб рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣реА рд╣реИ, рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдУред рдпрд╣ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:
My_appl.register empty_service (fun () () -> Eliom_services.onload {{ Js.Opt.iter (Dom_html.document##getElementById (Js.string "clientbutton")) ( fun clntbutton -> clntbutton##onclick <- Dom_html.handler (fun _ -> Js.Opt.iter (Dom_html.document##getElementById (Js.string "clientcode")) ( fun cdinput -> Js.Opt.iter (Dom_html.document##getElementById (Js.string "clientoutput")) ( fun cdoutput -> let cdinputarea = Dom_html.CoerceTo.textarea cdinput in Js.Opt.iter cdinputarea (fun x -> let i = Js.to_string x##value in cdoutput##innerHTML <- Js.string (yoba_execute i) ) ) ); Js._true ) ) }}; interpret !code_example);;
{{...}} рдмреНрд▓реЙрдХ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдлрдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╣реИ - рд╣рдо рдЗрд╕реЗ рдкреЗрдЬ рдХреЗ рдСрдирд▓реЛрдб рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВред
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рддреЗрдЬ рдХреЗ рдмрдЬрд╛рдп, рдбрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП DOM_html.document ## getElementById рд╕рд░рд▓ "document.getElementById" рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдХрдИ Js.Opt.iter рдЬреЛ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ getElementById рдлрд╝рдВрдХреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, Js.Opt.iter рдкрд░рд┐рдгрд╛рдо рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рддрднреА рдХрд░реЗрдЧрд╛ рдЬрдм рдкрд░рд┐рдгрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЬрд┐рд╕ рдкреГрд╖реНрда рдкрд░ рд╣рдо рджреЗрдЦ рд░рд╣реЗ рдереЗ, рдЙрд╕ рдкрд░ рддреАрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд╛рд░ Js.Opt.iter рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЪрд╛рд░ - рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ getElementById рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрддреНрд╡ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ textarea рдореЗрдВ рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ (text_html.CoerceTo) рдХреЛ textarea рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрдВрдЬреАрдХреГрдд рд╕реЗрд╡рд╛ рд╣реИрдВрдбрд▓рд░ рд╕рд┐рд░реНрдл рджреЛ рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдкреГрд╖реНрда рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЗрдПрд╕-рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдКрдкрд░ рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИред
рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ, рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд░реЗрдлрд░реА) рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ code_example рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реЗ рдбреАрдлрд╝рд░ рдХрд░ рджрд┐рдпрд╛ред рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╕рдордп рдореЗрд░реЗ рд╕рд╛рде рдпрд╣ рд╣реБрдЖ рдерд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдпреЛрдмрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдореВрд╣рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рджреВрд╕рд░реЛрдВ рдХреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдФрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЙрд╕реЗ рдмрдЪрд╛рдПрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рд╕реЗрд╡рд╛ рдХреЗ рдмрдЧрд▓ рдореЗрдВ, рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рджреВрд╕рд░реА рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ рдПрдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рд▓реЗрдЧреА рдФрд░ рдЗрд╕реЗ code_example рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧреАред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ Eliom_output.Caml рдХреА рдУрд░ рд╕реЗ рдмрдирд╛рдПрдВ:
let update_code_service = Eliom_output.Caml.register_service ~path:["update code"] ~get_params:(string "f") (fun f () -> code_example := f; return ());;
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рди (рдЬреЛ рдХрд┐ рд╕рдмрд╕реЗ рдЖрдВрддрд░рд┐рдХ рд╣реИ) рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
let i = Js.to_string x##value in ignore(Eliom_client.call_caml_service ~service:%update_code_service i ()); cdoutput##innerHTML <- Js.string (yoba_execute i)
рджреЗрдЦрд╛! рдЕрдм рд╣рдорд╛рд░реЗ рдкреЗрдЬ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдЙрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдЪ рд╣реИ, рдЬрдм рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред
рдЕрдВрдд рдореЗрдВ, Makefile рд▓рд┐рдЦреЗрдВ:
MODULE = yoba APP = yoba include Makefile.config SERVERFILES := home.eliom CLIENTFILES := yobaType.ml yobaLexer.eliom yobaParser.eliom yobaLang.eliom home.eliom SERVERLIB := -package eliom.server,ocsigenserver,lwt CLIENTLIB := -package js_of_ocaml INCLUDES = EXTRADIRS = include Makefile.rules yobaParser.eliom: ocamlyacc yobaParser.mly echo '{client{' >yobaParser.eliom cat yobaParser.ml >>yobaParser.eliom echo '}}' >>yobaParser.eliom sed -i 's/;;//' yobaParser.eliom rm yobaParser.ml yobaParser.mli yobaLexer.eliom: yobaParser.eliom ocamllex yobaLexer.mll echo '{client{' >yobaLexer.eliom cat yobaLexer.ml >>yobaLexer.eliom echo '}}' >>yobaLexer.eliom sed -i 's/;;//' yobaLexer.eliom rm yobaLexer.ml _build/client/yobaLexer.cmo: _build/client/yobaParser.cmo _build/client/yobaLang.cmo: _build/client/yobaLexer.cmo _build/client/yobaParser.cmo $(STATICDIR)/$(APP).js: _build/client/${MODULE}.cmo ${JS_OF_ELIOM} -jsopt -pretty -verbose ${CLIENTLIB} -o $@ $^ #yui-compressor --charset utf-8 $@ > $@_min #mv $@_min $@ pack: $(STATICDIR)/$(APP).js
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ yOBLexer.eliom рдФрд░ yobaParser.eliom рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд┐рдпрдо рд▓рд┐рдЦреЗред рдЗрд╕реА рддрд░рд╣, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрднрд░рддрд╛ рдЬрдирд░реЗрдЯрд░ рд╣рдорд╛рд░реЗ рд▓реЗрд╕рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЙрд╕реЗ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдорджрдж рдХреАред
рдЕрдм рдЖрдк рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
make depend
make
make pack
рдкрд╣рд▓рд╛ рдПрдХ рд╕рдВрдХрд▓рди рдЖрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рджреВрд╕рд░рд╛ рдПрдХ рд╕рд░реНрд╡рд░ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рддреАрд╕рд░рд╛ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдХреЙрд▓ рдХреЛ рдкреЗрдЬ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдпреВ-рдХрдВрдкреНрд░реЗрд╕рд░ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдПрдорд╡реА рдХреЛ рдХреЙрд▓ рдХреЛ рдЕрдирд╕реБрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬреЗрдПрд╕ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, 400kb рд╕реЗ 209kb рдкрд░)ред
рдЖрдкрдХреЛ рдирд┐рд░реНрдпрд╛рдд PATH рд▓рд┐рдЦрдХрд░ рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ ocsigctorver рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдиреЗ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, $ HOME / bin / ocsigen / bin рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХрд╣реЗрдВ ./ocsigucerver
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдФрд░ рдЕрдЧрд░ рдЖрдк рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ, рддреЛ рдЖрдк рдореЗрд░реЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
sorokdva.net