{"action":"created","issue":{"url":"https://api.github.com/repos/ocsigen/js_of_ocaml/issues/239","labels_url":"https://api.github.com/repos/ocsigen/js_of_ocaml/issues/239/labels{/name}","comments_url":"https://api.github.com/repos/ocsigen/js_of_ocaml/issues/239/comments","events_url":"https://api.github.com/repos/ocsigen/js_of_ocaml/issues/239/events","html_url":"https://github.com/ocsigen/js_of_ocaml/pull/239","id":46184959,"number":239,"title":"Ppx for js_of_ocaml","user":{"login":"Drup","id":801124,"avatar_url":"https://avatars.githubusercontent.com/u/801124?v=3","gravatar_id":"","url":"https://api.github.com/users/Drup","html_url":"https://github.com/Drup","followers_url":"https://api.github.com/users/Drup/followers","following_url":"https://api.github.com/users/Drup/following{/other_user}","gists_url":"https://api.github.com/users/Drup/gists{/gist_id}","starred_url":"https://api.github.com/users/Drup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Drup/subscriptions","organizations_url":"https://api.github.com/users/Drup/orgs","repos_url":"https://api.github.com/users/Drup/repos","events_url":"https://api.github.com/users/Drup/events{/privacy}","received_events_url":"https://api.github.com/users/Drup/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":22,"created_at":"2014-10-18T19:26:11Z","updated_at":"2015-03-31T23:52:05Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/ocsigen/js_of_ocaml/pulls/239","html_url":"https://github.com/ocsigen/js_of_ocaml/pull/239","diff_url":"https://github.com/ocsigen/js_of_ocaml/pull/239.diff","patch_url":"https://github.com/ocsigen/js_of_ocaml/pull/239.patch"},"body":"Should not be merged, the syntax is not the final one (waiting for ocaml here).\r\n\r\nIt's feature-par with the camlp4 one, plus object literals with optional fields.\r\n\r\n - `obj##.field` for field access\r\n - `obj##.field := x` for field modification\r\n - `obj##meth arg1 arg2 arg3` for method calls\r\n - `obj##meth` for method calls without arguments\r\n - `new%js constructor` for prototype instanciation.\r\n - `object%js ... end` for literal objects. `[@@optional]` to make the field optional.\r\n\r\nWhat remains to do:\r\n\r\n - Automatic generation of literal object's type (especially wrt to optional fields).\r\n - (DONE) Use the mutable annotation in object literals to choose between `readonly_prop` and `prop`.\r\n - Clean up and factorize the code some more.\r\n - Document.\r\n - Test error locations.\r\n - Solve the \"fresh name\" issue. I'm not fond of the fixed seed prng solution.\r\n\r\ncc @whitequark @alainfrisch"},"comment":{"url":"https://api.github.com/repos/ocsigen/js_of_ocaml/issues/comments/88287574","html_url":"https://github.com/ocsigen/js_of_ocaml/pull/239#issuecomment-88287574","issue_url":"https://api.github.com/repos/ocsigen/js_of_ocaml/issues/239","id":88287574,"user":{"login":"Drup","id":801124,"avatar_url":"https://avatars.githubusercontent.com/u/801124?v=3","gravatar_id":"","url":"https://api.github.com/users/Drup","html_url":"https://github.com/Drup","followers_url":"https://api.github.com/users/Drup/followers","following_url":"https://api.github.com/users/Drup/following{/other_user}","gists_url":"https://api.github.com/users/Drup/gists{/gist_id}","starred_url":"https://api.github.com/users/Drup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Drup/subscriptions","organizations_url":"https://api.github.com/users/Drup/orgs","repos_url":"https://api.github.com/users/Drup/repos","events_url":"https://api.github.com/users/Drup/events{/privacy}","received_events_url":"https://api.github.com/users/Drup/received_events","type":"User","site_admin":false},"created_at":"2015-03-31T23:52:05Z","updated_at":"2015-03-31T23:52:05Z","body":"Ok, then I'm done. The locations are tested and the documentation is written. :)"}}