{"action":"created","issue":{"url":"https://api.github.com/repos/coq/coq/issues/72","labels_url":"https://api.github.com/repos/coq/coq/issues/72/labels{/name}","comments_url":"https://api.github.com/repos/coq/coq/issues/72/comments","events_url":"https://api.github.com/repos/coq/coq/issues/72/events","html_url":"https://github.com/coq/coq/pull/72","id":90440083,"number":72,"title":"Quote coercions","user":{"login":"fchyzak","id":8860458,"avatar_url":"https://avatars.githubusercontent.com/u/8860458?v=3","gravatar_id":"","url":"https://api.github.com/users/fchyzak","html_url":"https://github.com/fchyzak","followers_url":"https://api.github.com/users/fchyzak/followers","following_url":"https://api.github.com/users/fchyzak/following{/other_user}","gists_url":"https://api.github.com/users/fchyzak/gists{/gist_id}","starred_url":"https://api.github.com/users/fchyzak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fchyzak/subscriptions","organizations_url":"https://api.github.com/users/fchyzak/orgs","repos_url":"https://api.github.com/users/fchyzak/repos","events_url":"https://api.github.com/users/fchyzak/events{/privacy}","received_events_url":"https://api.github.com/users/fchyzak/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":7,"created_at":"2015-06-23T17:06:18Z","updated_at":"2015-07-03T16:15:12Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/coq/coq/pulls/72","html_url":"https://github.com/coq/coq/pull/72","diff_url":"https://github.com/coq/coq/pull/72.diff","patch_url":"https://github.com/coq/coq/pull/72.patch"},"body":"Kill dead code (first commit) + Proposed new functionality: [Set Printing Coercions Quoted] that displays coercions between “...”."},"comment":{"url":"https://api.github.com/repos/coq/coq/issues/comments/118385337","html_url":"https://github.com/coq/coq/pull/72#issuecomment-118385337","issue_url":"https://api.github.com/repos/coq/coq/issues/72","id":118385337,"user":{"login":"gasche","id":426238,"avatar_url":"https://avatars.githubusercontent.com/u/426238?v=3","gravatar_id":"","url":"https://api.github.com/users/gasche","html_url":"https://github.com/gasche","followers_url":"https://api.github.com/users/gasche/followers","following_url":"https://api.github.com/users/gasche/following{/other_user}","gists_url":"https://api.github.com/users/gasche/gists{/gist_id}","starred_url":"https://api.github.com/users/gasche/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasche/subscriptions","organizations_url":"https://api.github.com/users/gasche/orgs","repos_url":"https://api.github.com/users/gasche/repos","events_url":"https://api.github.com/users/gasche/events{/privacy}","received_events_url":"https://api.github.com/users/gasche/received_events","type":"User","site_admin":false},"created_at":"2015-07-03T16:15:12Z","updated_at":"2015-07-03T16:15:12Z","body":"In the OCaml community, a standard (\"visitor\") pattern is to expose open-recursive `map` and `fold` to help people economically implement their own traversals. There are examples of this in the compiler-provided library exposed to users to preprocess OCaml abstract syntax trees, [ast_mapper.mli](https://github.com/ocaml/ocaml/blob/trunk/parsing/ast_mapper.mli#L50-L104), using records and explicit open recursion (see this [usage example](http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/)), and in the library printing said syntax trees to strings (letting others maybe tweak the pretty-printing) [in object-oriented style](https://github.com/ocaml/ocaml/blob/trunk/parsing/pprintast.mli#L14-L133).\r\n\r\n"}}