Ocaml составление списка пониманий - PullRequest
2 голосов
/ 29 октября 2019

Я хочу использовать ocamlopt для составления списков. Я не хочу использовать какие-либо специальные библиотеки, так как ocaml поддерживает списки по крайней мере на верхнем (интерактивном) уровне.

Marko Tunjic опубликовал:

Понимание списка уже включено в стандартную ocaml

#require "camlp4.listcomprehension";;

[ x * x | x <- [ 1;2;3;4;5] ];;

- : int list = [1; 4; 9; 16; 25]

В ocaml 4.07.1 я обнаружил, что в интерактивном режиме требуется следующее:

#use "topfind";;
#camlp4o;;
#require "camlp4.listcomprehension";;

файл lc1.ml содержит

open Camlp4.ListComprehensions

let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ];;

compile

ocamlfind ocamlopt -package camlp4 -linkpkg lc1.ml -o lc1

File "lc1.ml", line 3, characters 16-17:
Error: Syntax error

ожидаемые результаты

[10; 11; 12; 13; 14; 20; 22; 24; 26; 28; 30; 33; 36; 39; 42; 40; 44;      48; 52;
 56; 50; 55; 60; 65; 70]

1 Ответ

2 голосов
/ 30 октября 2019

Прежде всего, отказ от ответственности. Camlp4 устарела, поэтому я очень не рекомендую использовать его в любом новом проекте. Подумайте об использовании ppx, или если вам действительно нужно то, что ppx не может предоставить вам, то camlp5 все еще к вашим услугам.

Чтобы создать программу, написанную с нестандартным синтаксисом OCaml, вынужно явно указать ocamlfind какой синтаксис вы используете, например, -syntax camlp4o. Это аналогично директиве #camlp4o утилиты topfind, которую вы использовали.

Далее вам не нужно ничего открывать (оператор open в OCaml просто расширяет текущее пространство именс определениями из открытого модуля). Не существует такого модуля, как Camlp4.ListComprehensions, поэтому правильная версия вашей программы

let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ]

, а вот команда сборки

ocamlfind ocamlopt -syntax camlp4o -package camlp4.listcomprehension -linkpkg lc1.ml -o lc1
...