From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: cilibrar@gmail.com
Cc: caml users <caml-list@inria.fr>
Subject: Re: [Caml-list] Request for hint/help in camlp4/5-ppx conversion of famous logic quotation code by Harrison
Date: Sun, 4 Nov 2018 19:06:42 +0100 [thread overview]
Message-ID: <CAPFanBFFemXovGArvq+2W64sg=RX7EZrWHJ8aR=P6Fprd6rHgg@mail.gmail.com> (raw)
In-Reply-To: <CAPFanBEG8vnFVb7buZw0o3xd5GqeW9XrZPzyJ+h9n9+1RkKRBw@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 4492 bytes --]
Here is a transcript of using plain OCaml code instead of the extension:
(* mock parsers for testing; I'm sure the real definitions are more
interesting *)
let default_parser str = `Default str
let secondary_parser str = `Secondary str
(* do the same test as done by the syntax extension *)
let default_or_secondary_parser s =
if String.sub s 0 1 = "|" && String.sub s (String.length s - 1) 1 = "|"
then secondary_parser (String.sub s 1 (String.length s - 1))
else default_parser s
(* convenient infix operator *)
let (!!) = default_or_secondary_parser
(* example use-cases from
https://github.com/logic-tools/sml-handbook/blob/master/code/OCaml/example.ml
*)
let gold = !!{|p /\ q <=> ((p <=> q) <=> p \/ q)|} (* default parser *)
let test =
["fix1", !!{||--(imp(G,imp(Pr(G),S)))||};
"fix2", !!{||--(imp(imp(Pr(G),S),G))||}];
(* the doubling of "|" in formulas above signals the secondary parser. *)
On Sun, Nov 4, 2018 at 7:00 PM Gabriel Scherer <gabriel.scherer@gmail.com>
wrote:
> It looks like what this syntax extension is doing is to rewrite fragments
> of the form
>
> <<foo>>
>
> into
>
> default_parser "foo"
>
> and
>
> <<|foo|>>
>
> into
>
> secondary_parser "foo".
>
> You should be able to translate examples from the book simply by doing
> this rewriting by hand. If the string/formula contains backslashes, it can
> be painful to properly escape them to follow the lexical conventions of
> OCaml double-quoted string literals, but you can use the new string literal
> {|foo|} to avoid escapes. For example, "a\\b" can be rewritten into {|a\b|}.
>
>
> On Sun, Nov 4, 2018 at 6:42 PM Rudi Cilibrasi <cilibrar@gmail.com> wrote:
>
>> Greetings ML friends,
>>
>> I have been gradually following the ML style languages a couple decades
>> with HOL/SML etc and recently got interested in the OCaml variation.
>>
>> I've been able to make simple OCaml programs for my research but am
>> hitting a steep learning curve trying to understand the differences
>> between the preprocessors camlp4, camlp5, and ppx. The documentation
>> is confusing to me at this point.
>>
>> I have been trying to compile the code from the famous and great book
>> on logic called "Handbook of Practical Logic and Automated Reasoning"
>> but it does not work for me under Ubuntu 18.04 using OCaml 4.05. I
>> have opam 1.2.2. I am getting an "Unbound module Quotation" error
>> that Icannot solve and I suspect is related to old coding convention
>> for preprocessing. Would anybody on the list be able to help me (perhaps
>> privately via email/github) to convert this small fragment to modern
>> PPX syntax so that we can "unlock" the rest of the code describing first
>> order logic? I attach a transcript below trying to compile one of many
>> copies of the same code on github, this one from
>>
>> https://github.com/logic-tools/sml-handbook/tree/master/code/OCaml
>>
>> Any help or info you can provide to get unblocked would be appreciated.
>> Thank you in advance for your kind attention.
>>
>> Best regards,
>>
>> Rudi
>>
>> ----------------------------------------------------------------------------------------
>> ➜ sml-handbook git:(master) ✗ cd code/OCaml
>> ➜ OCaml git:(master) ✗ make
>> echo '#use "init.ml";;' >.ocamlinit; (sleep 3s; rm -f .ocamlinit) & ocaml
>> OCaml version 4.05.0
>>
>> File "Quotexpander.ml", line 2, characters 5-72:
>> Warning 3: deprecated: Pervasives.&
>> Use (&&) instead.
>> File "Quotexpander.ml", line 7, characters 0-13:
>> Error: Unbound module Quotation
>> File "Quotexpander.ml", line 998, characters 7-9:
>> Unbound quotation: ""
>> Camlp5 parsing version 7.06
>>
>> #
>> ➜ OCaml git:(master) ✗ cat Quotexpander.ml
>> let quotexpander s =
>> if String.sub s 0 1 = "|" & String.sub s (String.length s - 1) 1 = "|"
>> then
>> "secondary_parser \""^
>> (String.escaped (String.sub s 1 (String.length s - 2)))^"\""
>> else "default_parser \""^(String.escaped s)^"\"";;
>>
>> Quotation.add "" (Quotation.ExStr (fun x -> quotexpander));;
>> ➜ OCaml git:(master) ✗ ocaml --version
>> The OCaml toplevel, version 4.05.0
>> ➜ OCaml git:(master) ✗ opam --version
>> 1.2.2
>> ➜ OCaml git:(master) ✗
>>
>>
>> --
>> Happy to Code with Integrity : Software Engineering Code of Ethics and
>> Professional Practice <http://www.acm.org/about/about/se-code>
>>
>
[-- Attachment #2: Type: text/html, Size: 6617 bytes --]
prev parent reply other threads:[~2018-11-04 17:57 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-04 17:41 Rudi Cilibrasi
2018-11-04 18:00 ` Gabriel Scherer
2018-11-04 18:06 ` Gabriel Scherer [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAPFanBFFemXovGArvq+2W64sg=RX7EZrWHJ8aR=P6Fprd6rHgg@mail.gmail.com' \
--to=gabriel.scherer@gmail.com \
--cc=caml-list@inria.fr \
--cc=cilibrar@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox