ocamljs ã使ãã ï¼ OCamlããJavaScriptã¸ã®å¤æ
ocamljs 㯠OCamlãã JavaScript ã¸ã®ãã©ã³ã¹ã¬ã¼ã¿ã ãååã®è¨äºã¨é çªãéã«ãªã£ã¦ãã¾ã£ãããã©ä»åã¯ocamljsã«ã¤ãã¦æ¸ã (åºæ¬çã« http://jaked.github.com/ocamljs/ 以å¤ã®ãã¨ã¯æ¸ãã¦ãªãã§ãã)ã
JavaScriptã¯æ´å²ççµç·¯ã¨ãã®ç°¡æ½ãããwebãã©ã¦ã¶ã§ä½¿ããã¦ãããï¼éçåä»ãã§ãªãã®ã§ä¿¡é ¼æ§ã®é¢ã§ãã¾ãã¡ä¸å®ã ã£ãããè¨èªã®ä½¿ããããã®é¢ã§ããã¿ã¼ã³ãããã®æ§æãç¡ãã¨ããã¾ã¨ããªã¢ã¸ã¥ã¼ã«ã·ã¹ãã ããªãã¨ãã§è¯ããªãã ocamljsã使ãã°ãæ¯è¼çå®å
¨ã»ç°¡æ½ã«å¤§è¦æ¨¡ãã¤åçãªwebãã¼ã¸ãæ§æã§ãããããããªãã
ocamljsã¯æ®å¿µãªããã¾ã æçãã¦ããã¨ã¯ãããªãããå®ã¯æ¢ã«ããã髿©è½ã ã ç¾ãã¼ã¸ã§ã³ã§æ¢ã« DOM ã jQuery ã OCaml ããæä½ã§ããããããã¨ãªãã° JavaScriptã®ã½ã¼ã¹ã OCaml ã«ç´æ¥è¨è¿°ã§ããæ§ææ¡å¼µãåãã£ã¦ãããä»ã«ã¯ lwt (light-weight thread) ã®ã©ã¤ãã©ãªã¨ä½µç¨ã§ããã®ã§ AJAXé¢é£ã®ã³ã¼ããè¤æ°ã¹ã¬ãããç¨ãã¦ã¹ãããªã¨è¨è¿°ã§ããã ããã ä½è
èªèº«ãéçºãã¦ãã froc (颿°çã«ã¤ãã³ãåä½ãè¨è¿°ã§ãã Functional Reactive Programmingã®å®è£
) ã orpc (ãªã¢ã¼ãããã·ã¼ã¸ã£ã³ã¼ã«) ãæ¥½ãããã ã åèï¼froc ã® examples
ããã¾ã§ocamljsã使ã£ã¦ãããããã§ã¯ãå®è¡å¹çãæªãã¨æãããã¨ã¯ãªãã ocamljs㯠OCamlã³ã³ãã¤ã©ãã³ã³ãã¤ã«ã®éä¸ã§çæããλå¼ã使ã£ã¦ãé常ãã¤ããªãçæããã¨ããã代ããã«JavaScriptã®ã³ã¼ããçæããã ãã®Î»å¼ã¯JavaScriptã®functionã«å¯¾å¿ããã å¹çã®è¯ãã®çç±ãããããªãã
é¡ä¼¼ã®ããã¸ã§ã¯ãã«ãobrowserã¨ãã OCamlãåããã¤ãã³ã¼ã(.cmoã¨ã)ãJavaScriptã§è§£éå®è¡ãã å®è£
ããããã§ããããã ocamljs ã®æ¹ãå¹çããå®è¡ããã®ã ãããã¾ãocamljsã¯JavaScriptã®ãªãã¸ã§ã¯ãããã¾ãOCamlã®ãªãã¸ã§ã¯ãã«å¯¾å¿ã¥ããã®ã«æåãã¦ããã¨æãã ä»ã«ã¯ Js_of_ocamlã¨ãããOCamlãã¤ãã³ã¼ãããJavaScriptãçæãããã¼ã«ããããã¾ã 試ãã¦ããªããOcamljsã¨ã®ããã©ã¼ãã³ã¹ã®å·®ã¯ãã£ã¨ããã¯ãã ã
éçåä»ãã®è¨èªããJavaScriptã®ã³ã¼ããçæãããã¼ã«ã¯ä»ã« Google Web Toolkit ããããä½è«ã«ãªãã GWT ã使ã£ã¦ããã¢ããªä¸è¦§ã¨ããã®ãè¦ã¤ããã Google Checkout ã« GWT ã使ããã¦ããã®ã¯ããã¯ãã¯ãªãã£ã«ã«ãªé¨åã«éçåä»ãã§ä¿¡é ¼æ§ãæ
ä¿ãã¦ããããã£ãã®ã ãããï¼
éæ
OCamlã§æ¸ããããã«ãªã£ã¦ä¸çªå¬ããã£ãã®ã¯ããªã¢ã³ãåã¨ãã¿ã¼ã³ãããã使ãããã¨ã ã£ãããã¡ãã忤æ»ãããã®ãå¬ããã®ã ãã©ã
ä»ã¯ CSS3ã®ã¢ãã¡ã¼ã·ã§ã³ãã¹ãã¼ããã©ã³ã®ã¿ããããã«ã®æ©è½ã使ã£ã¦è²ã
æ¸ãã¦ããã®ã ããã©ãJavaScriptã§æ¸ãã¦ããã¨ãã¯UIå¨ãã®ã¤ãã³ããã³ããªã³ã°ãè¤éã«ãªããã¡ã ã£ãã
ã§ã OCaml ã«åãæ¿ãããã ããªã¢ã³ãã§å ´ååããã¦ãããã±ã¼ã¹ã«ã®ã¿å¿
è¦ãªãã¼ã¿ãã¿ã°ã«æ¼ãè¾¼ãããã¨ã§è²ã
ã¨ã¹ãããªæ¸ããããã«ãªã£ãã è¯ãã§ãã
é¢åãªã¨ã㯠JavaScript ã®ã³ã¼ããç´æ¥OCamlã«æ¸ãã°ããã Obj.magic ã§å¼·å¶çã«å夿(ã©ã¤ãã©ãªã«å¿
è¦ãªCSSã®ããããã£ãå®ç¾©ããã¦ããªãã¨ã)ãããã¨ãããããã©ãããç¨ã ã¨æãã
ãããããã£ã¨è©³ç´°â
ã¤ã³ã¹ãã¼ã«
- OCaml 㨠OCamlã®ã©ã¤ãã©ãª findlib, ulex ãã¤ã³ã¹ãã¼ã«ã Macãªã port install ocaml caml-findlib caml-ulex
- ocamljs ã®ã½ã¼ã¹ããªã¼ãå±éããã
- 1.ã§ã¤ã³ã¹ãã¼ã«ããã®ã¨åããã¼ã¸ã§ã³ã®OCamlã®ã½ã¼ã¹ããªã¼(ä¾ï¼ocaml-3.12.0.tar.bz2) ã ocamljs ã®å å¼ãã£ã¬ã¯ããªã«å±éããã
- ocamljs ã®ããªã¼ã§ ./configure && make && sudo make install ããã¥ã¡ã³ããå¿ è¦ãªã make doc
使ã£ã¦ã¿ãï¼ test.ml ã test.js ã«ã³ã³ãã¤ã«
ã½ã¼ã¹ï¼test.ml
let _ = Dom.window#alert "Hello, ocamljs!"
alert('Hello, ocamljs'); ãå®è¡ããã ãã®ããã°ã©ã ã
ã³ã³ãã¤ã«
ocamlfindjs ocamljs -syntax camlp4o -package jslib.inline,dom test.ml -linkpkg -o test.js
ocamlfindjs 㯠findlib ã® ocamlfind ã³ãã³ã ã¨åããã¤ã¾ãï¼
- ocamlfindjs ocamljs ã¯ã³ã³ãã¤ã©ã®å¼ã³åºã
- -package dom 㯠Domã¢ã¸ã¥ã¼ã« ãå©ç¨ããããã®ãã¾ããªã
- -syntax camlp4o 㨠-package jslib.inline 㯠OCaml ã®ã³ã¼ãä¸ã§ JavaScript ãæ¸ãããã®ãã¾ããªã
- -linkpkg 㯠JavaScript ãåãããã«å¿ è¦ãªãªãã·ã§ã³
çæããã test.js ãFirebugãªã©ãã©ã¦ã¶ã®JavaScriptã³ã³ã½ã¼ã«ã«è²¼ãä»ããã htmlã®scriptã¿ã°ã§ãã¼ãããã°åãã
JavaScriptã¨ã®é£æº
- æ°å¤åã¯ãã¹ã¦JavaScriptã®æ°å¤ã§è§£éãããã
- æååã®æ±ãã¯å°ãåä»ã ã String.create ã§ä½ã£ãå ´åã« mutableãªOCamlã®æååã«, ãã以å¤ã®å ´åã¯JavaScriptã®immutableãªæååã«ãªãã (ã¨ãã£ã¦ããmutableãªæååãªãã¦ç§ã¯ä½¿ã£ããã¨ããªãã®ã§ããã»ã©åé¡ã¨ã¯æããªãã)
- OCamlã®ãªãã¸ã§ã¯ãã¯JavaScriptã®ãªãã¸ã§ã¯ãã«å¯¾å¿ãã(å¾è¿°)ãããã ocamljs ã®æãç´ æµãªã¨ããã
- OCamlã®é¢æ°ã¯JavaScriptã®é¢æ°ã«ãªã(OCamlã®é¢æ°ãJavaScriptå´ããã³ã¼ã«ããã¯ã§ãã)ã(éã¯çã§ã¯ãªããããªæ°ããã;ããè¦ã)
- OCamlã®é åã¯JavaScriptã®é åâ¦ã ã£ãã¯ã⦠ã ãã© Javascriptã¢ã¸ã¥ã¼ã« ã«ã¯ js_arrayã¨ããå¥ã®é åã¯ã©ã¹ãããâ¦
- ã¬ã³ã¼ããããªã¢ã³ãã¯OCamlã®ä¸ã§ãã使ããªãã
åºæ¬çãªã¢ã¸ã¥ã¼ã«
PervasivesãPrintfãªã©OCamlã®æ¨æºã©ã¤ãã©ãªã«å«ã¾ããã¢ã¸ã¥ã¼ã«ã¯å¤§æµä½¿ãããã»ãã«Javascriptã¢ã¸ã¥ã¼ã«ã¯JavaScriptã®æ¨æºã©ã¤ãã©ãªãã©ãããã¦ãã(ç§ã¯ä½¿ã£ããã¨ããªãã£ãâ¦)ã
ãã©ã¦ã¶ã«é¢ããæ®ã©ã®åºæ¬çãªæä½ã¯ Domã¢ã¸ã¥ã¼ã«ã«ãããä¾ãã° alert 㯠Dom.window#alert : string -> unit ã ã ã㨠document ãªãã¸ã§ã¯ã㯠Dom.document (ã¤ã¾ã document.getElementById 㯠Dom.document#getElementById) ãã®2ã¤ããããã°å¾ã¯ããã¥ã¡ã³ããèªã¿ã¤ã¤ãªãã¨ããªãâ¦ãããããªãã
ã¹ã¿ã¤ã«ã·ã¼ãã®å±æ§ãªãããä¸éãstyleã¯ã©ã¹ã«æã£ã¦ããã®ã§ãã¾ãå°ããªãã
ããè¶³ããªã屿§ãã¿ã¤ãããOcamljs.fieldref : 'a -> string -> 'b ã§ããã·ã¥ã¨ãã¦èªã¿åºããï¼ æ¢åã® class type ã inherit ããæ°ããclass typeãä½ãã Obj.magic ã§ã ãªã¤ãªå¤æããã
ããã§JavaScriptå´ããnullãããããªãå¤ãæ¾ã£ããOcamljs.option_of_nullable : 'a -> 'a optionã§optionåã«å¤ãã¦ããã¨ãã
JavaScript ã®ãªãã¸ã§ã¯ããOCamlå´ã§è§¦ãã«ã¯
ã¡ã½ããå¼ã³åºã
JavaScriptã®ãªãã¸ã§ã¯ãã«å¯¾ããã¡ã½ããå¼ã³åºã o.f(arg1,..,argN) 㯠OCaml ã§ o#f arg1 .. argN ã«ãªããç´æçã ã
å¤ã®ä»£å ¥ã¨èªã¿åºã
䏿¹ãå¤ã®è¨å®ãå¼ã³åºãã¯å°ãç¹æ®ã§ã o.f ã®èªã¿åºã㯠o#_get_f ã¨ãªãã ä»£å ¥ o.f = e 㯠o#_set_f e ã¨ãªãã
ã¡ã½ããã®å¥åã¨åä»ãã«é¢ãã¦
ãã®ä»ã«ã ocamljs ã«ãã㦠ã¡ã½ããåã®å¾ã«ã¤ã _.*_ ã¯ç¡è¦ããããä¾ãã° addEventListener 㨠addEventListener_mouseEvent_ 㯠ããªã JavaScript ã® addEventListener ã¡ã½ãããå¼ã³åºãã ãããã£ã¦1ã¤ã®ã¡ã½ããã«è¤æ°ã®åããã¾ãä»ãã¦ãã(OCamlã§ã¯ã¡ã½ããã®å¤éå®ç¾©ã¯ã§ããªã)ã
DomãjQueryçã§ã©ããã¦ããã¾ãOCamlã®åãã¤ããããªãå ´å㯠'a åã弿°ã«åã£ãã #element ãªã©ã® #åãæ»ãå¤ã®åã«ãªã£ã¦ããããã¦åå®å
¨ã§ã¯ãªããªã£ã¦ãããããã¯ä»æ¹ããªãã
ã»ã
ãã¤ãã£ããª(JavaScriptã®)ã¡ã½ããå¼ã³åºãã®åé©ç¨ã¯ã§ããªããã²ã¨ã¤ã§ã弿°ãä¸ããã¨ãã®å ´ã§å¼ã³åºããã¦ãã¾ãã ã¤ã¾ã弿°ã®æ°ããã£ããééãã¦ãæ®éã«ã¡ã½ãããå¼ã³åºããã¦ãã¾ãã®ã§å°ãå±éºã ãã ãããã弿°ã®ä¸è¶³çã¯OCamlã®å ´å忤æ»ã¨ã³ã³ãã¤ã©è¦åã§å ¨ã¦æ¤åºã§ããã®ã§ãè¦åãç¡è¦ãããèªåã§ ignore ã¨ããã£ã¦ãã¾ããªãéãã¯åé¡ãªãã ã¾ãåé©ç¨ã¯ä¾ãã°2弿°ã®o#fã«ã¤ã㦠o#f a ã¨ããããªãã° (fun x -> o#f a x)ã¨ããã°åããã¨ã ã
ã¤ã³ã©ã¤ã³JavaScript
é¢åãªã JavaScript ã OCaml ã®ã³ã¼ãã«ç´æ¥æ¸ãã°ããããã®å ´åã
open Ocamljs.Inline
ã¨ãã¦ããã << 㨠>> ã®éã« JavaScript ã®å¼ãæ¸ã(ãã ãæ£è¦è¡¨ç¾ãªãã©ã«ãªã©ä¸é¨ä½¿ããªãæ§æããã)ã ããã«ã JavaScript ã®å¼ä¸ã§ OCaml ã®å¼ã $ 1. +. 0.1 $ ã®ããã«æ¸ããã®ã§ãããããæ¸ããªãï¼ãã¨ãããã¨ã¯ã¾ãèµ·ãããªãã
ä¾ãã°ããã¾ãå½¹ã«ç«ããªãããã©ãalert颿°ãèªåã§æ¸ããªã
let alert (s:string) = ignore << alert($s$) >>
ã¨ãªãã ããã§ << >> ã§å²ãã JavaScriptå¼ã¯ 'a åãæã¤ã®ã§ãã£ãã¨åãä»ãã¦ãã¾ã£ãã»ããããã
ç¶ãã¯ã¾ãä»åº¦