Hazel是一个植根于类型理论原理的实时功能编程环境。您可以在Hazel网站上找到相关论文和更多动力。
您可以在线尝试Hazel:Dev分支是目前的主要分支。也可以访问已将其推向GitHub并成功构建的所有其他分支:
https://hazel.org/build/<branch_name>
如果您已经拥有ocaml版本5.2.0和至少已安装了opam版本的2.0版,则可以通过运行以下命令来构建Hazel。
git clone [email protected]:hazelgrove/hazel.gitcd hazelmake depsmake dev要查看Hazel,您必须将其服务于Localhost进行开发(由于浏览器限制了EG Web Workers,您无法从file:/// url。
如果您的路径上有python3 ,则可以通过make serve使用Python服务器,然后在浏览器中导航到http://0.0.0.0:8000/ 。
否则,运行make echo-html-dir将使用您选择的其他服务器来呼应需要使用的目录。
如果您不熟悉ocaml或opam ,请不要安装它们,或者只是卡住,建议您遵循install.md中包含的分步安装说明。
Hazel用推理编写,这是OCAML顶部的句法糖。此链接使您可以键入OCAML,并查看相应的ReasureMl语法是什么:https://reasonml.github.io/en/try。
如果您试图找出您知道ocaml语法的内容的ReasonML语法,这将很有用。
您也可以使用终端的refmt在终端处的OCAML和ReasonML语法之间转换。有关详细信息,请参见refmt --help 。
我们的大多数团队都使用Visual Studio代码(VS代码)来编写代码。如果您使用VS代码,这里有一些可能有用的扩展名。
此扩展程序为编辑推理源代码和相关工具提供了全面支持:
由于理性的解析错误不佳,因此很难找到不平衡的括号。以下扩展对此有所帮助。
除了这些扩展名外,启用面包板可以使导航大型代码库更容易。有多种使面包屑可见的方法:
Ctrl+Shift+P (MacOS: Cmd+Shift+P ),开始键入breadcrumbs ,然后选择View: Toggle Breadcrumbs以打开和关闭面包屑。Ctrl+Shift+.开始面包屑导航。如果您喜欢VIM绑定和VIM设置,以下内容可能会帮助您在Neovim设置IDE的理由。
如果您使用VIM,我建议您切换到Neovim,因为它对多线程有更好的支持,因此在编程时阻止您的可能性较小。
要设置LSP(语言服务器协议),您需要为OCAML设置Neovim和语言服务器的语言客户端。
安装前两个后,您可能需要将以下内容复制到Neovim配置文件。 (假设npm在/usr/bin下安装了OCAML语言服务器)
let g:LanguageClient_serverCommands = {
'ocaml': ['/usr/bin/ocaml-language-server', '--stdio'],
'reason': ['/usr/bin/ocaml-language-server', '--stdio']
}
" LanguageClient-neovim
nnoremap <F5> :call LanguageClient_contextMenu()<CR>
" Or map each action separately
nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
nnoremap <silent> gr :call LanguageClient#textDocument_references()<CR>
nnoremap <silent> gf :call LanguageClient#textDocument_formatting()<cr>
nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR>
Hazel通过js_of_ocaml编译器编译为Web浏览器的JavaScript。
尽管为方便提供了make ,但它们主要转化为dune命令。
单独调用make是等同于调用make dev 。使用这些命令,我们将其他标志传递给js_of_ocaml ,该标志导致插入评论的插入,该注释将生成的JS中的位置映射到源文件中的位置。这对于调试目的很有用。
还使用refmt进行make dev Auto-Formats推理源文件(这是@src/fmt别名的目的)。这样可以确保所有贡献者的代码遵循相同的样式。
make dev和make release命令做三件事:
menhir生成一些内部解析器。js_of_ocaml编译为JavaScript( _build/default/src/hazelweb/www/hazel.js )的OCAML字节码。要获得更平稳的开发体验,请使用make watch自动观看文件更改。这可能需要安装fswatch (请参阅install.md)。您还可以运行make watch-release以连续构建发行版构建(每个构建需要更长的时间)。
要获得干净的构建,您可能需要:
克隆存储库(如果没有),然后输入克隆榛树项目的项目根。
git clone [email protected]:hazelgrove/hazel.git
cd hazel设置特定于项目的本地OCAML环境并进行编译。如果您设置了本地OCAML环境(有一个名为_opam的目录),则可能需要首先将其删除。
# opam switch remove ./
opam switch create ./ 5.2.0
eval $( opam env )
make deps
make这在克隆项目中设置了一个独立的OCAML环境,与您在主目录中发送的独立词无关。这使您可以替代依赖关系或测试依赖性更改,而不会影响现有的OCAML项目。
注意:您可能会在构建时看到以下警告:
Warning 58 [no-cmx-file]: no cmx file was found in path for module Ezjs_idb, and its interface was not compiled with -opaque
这是由于上游图书馆的问题,不会引起Hazel的问题:
ocamlpro/ezjs_idb#1
您可以使用标准print_endline函数打印到浏览器控制台。这可能是目前最简单的方法。代码库中的大多数数据类型都具有[@deriving (show({with_path: false}), sexp, yojson)] 。这生成了用于打印和序列化此数据的辅助功能。对于命名t的类型, show功能将命名为show 。否则,对于名为q的其他类型,它将是show_q 。
使用Dev配置文件( make )本地制作时,应配置js_of_ocaml的源地图。这是使用每个顶级目录中存在的dune文件”中存在的ENV节配置的。
由于源地图是生成浏览器开发人员工具,应在调试器和源树中显示原因代码。堆栈跟踪还应包括原因行号。
如果Hazel挂在负载上或执行某些操作时,则可以通过将#debug附加到URL并重新加载来加载到调试模式。从那里,您有一些按钮可以更改设置或重置本地存储。刷新没有#debug旗帜,希望您可以从那里解决情况。
您可以通过运行进行test来运行make test中的所有单元测试。
使用Alcotest框架编写单元测试。
代码覆盖范围由BISECT_PPX提供。从测试中收集覆盖范围统计数据, make coverage 。生成覆盖范围统计信息后,正在运行的make generate-coverage-html将在_coverage/index.html上生成本地网页,该网页可以被视为每个模块都可以看到线覆盖范围。
当您将分支推向主要hazelgrove/hazel存储库时,我们将进行GitHub Action设置(请参见.github/workflows/deploy_branches.yml ),该设置将构建该分支(在release模式下),并将其部署到url https://hazel.org/build/<branch name> builds builds builts busess bucces。
通常,如果构建环境命中率,则通常需要2分钟,或20分钟以上。您可以在GitHub上的“操作”选项卡中查看构建状态。
2024年7月之前的构建在https://hazel.org/build/<branch name>上存档。
注意:如果需要执行另一个档案,请确保手动重新部署以下分支,因为我们在各种公共资料(网站和已发表的论文)中引用了这些分支:
开发人员