Hazel est un environnement de programmation fonctionnelle en direct ancré dans les principes de la théorie des types. Vous pouvez trouver les articles pertinents et plus de motivation sur le site Web de Hazel.
Vous pouvez essayer Hazel en ligne: la branche de développement est la branche principale en ce moment. Toutes les autres branches qui ont été poussées à Github et qui ont réussi à construire peuvent également être accessibles à:
https://hazel.org/build/<branch_name>
Si vous avez déjà ocaml version 5.2.0 et au moins la version 2.0 d' opam installée, vous pouvez créer Hazel en exécutant les commandes suivantes.
git clone [email protected]:hazelgrove/hazel.gitcd hazelmake depsmake dev Pour voir Hazel, vous devez le servir, sur LocalHost pour le développement (vous ne pouvez pas l'exécuter à partir d'un file:/// URL en raison des restrictions de navigateur sur les travailleurs Web.)
Si vous avez python3 sur votre chemin, vous pouvez utiliser le serveur Python via make serve , puis accédez à http://0.0.0.0:8000/ dans votre navigateur.
Sinon, make echo-html-dir qui fait écho au répertoire qui doit être servi à l'aide d'un autre serveur de votre choix.
Si vous n'êtes pas familier avec ocaml ou opam , ne les faites pas installer, ou tout simplement rester coincé, nous vous recommandons de suivre les instructions d'installation étape par étape contenues dans install.md.
Hazel est écrit en raisonml, qui est un sucre syntaxique au sommet de l'OCAML. Ce lien vous permet de taper OCAML et de voir quelle est la syntaxe de raison correspondante: https://reasonml.github.io/en/try.
Ceci est utile si vous essayez de déterminer la syntaxe de la raison pour laquelle vous connaissez la syntaxe OCAML.
Vous pouvez également convertir entre OCAML et Syntaxe de raison ML au terminal en utilisant refmt au terminal. Voir refmt --help pour les détails.
La plupart de notre équipe utilise Visual Studio Code (VS Code) pour écrire du code. Si vous utilisez VS Code, voici quelques extensions qui pourraient être utiles.
Cette extension fournit une prise en charge complète pour la modification du code source du raisonnement et des outils pertinents:
En raison des mauvaises erreurs d'analyse de la raison, les parenthèses déséquilibrées peuvent être difficiles à trouver. Les extensions suivantes aident à cela.
En plus de ces extensions, l'activation de la barre de chapelure peut faciliter la navigation d'une grande base de code. Il existe plusieurs façons de rendre la barre de chapelure visible:
Ctrl+Shift+P (macOS: Cmd+Shift+P ), commencez à taper breadcrumbs et sélectionnez View: Toggle Breadcrumbs dans le menu déroulant pour activer et désactiver la chapelure.Ctrl+Shift+. Pour commencer la navigation sur la chapelure.Si vous aimez votre liaison VIM et votre configuration VIM, ce qui suit peut vous aider à configurer votre raison IDE à Neovim.
Si vous utilisez VIM, je vous recommande de passer à Neovim car il a un meilleur support pour le multi-thread, et donc moins susceptible de vous bloquer lorsque vous programmation.
Pour configurer le LSP (Protocole de serveur de langage), vous devez configurer votre client linguistique pour Neovim et Language Server pour OCAML.
Après avoir installé les deux précédents, vous souhaiterez peut-être copier ce qui suit dans votre fichier de configuration Neovim. (En supposant que npm a un serveur de langue OCAML installé sous /usr/bin )
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 est compilé en JavaScript pour le navigateur Web via le compilateur js_of_ocaml .
Bien que make cibles soient fournies comme commodité, elles se traduisent principalement par des commandes dune .
Invoquer make en soi équivalent à invoquer make dev . Avec ces commandes, nous passons des indicateurs supplémentaires à js_of_ocaml qui provoquent l'insertion de commentaires qui mappent les emplacements dans le JS généré aux emplacements des fichiers source. Ceci est utile à des fins de débogage.
make dev Maison des fichiers source à l'aide refmt (c'est à cela que sert l'alias @src/fmt ). Cela garantit que le code de tous les contributeurs suit le même style.
Les commandes make dev et make release font trois choses:
menhir ._build/default/src/hazelweb/www/hazel.js ) en utilisant js_of_ocaml . Pour une expérience de développement plus lisse, utilisez make watch pour surveiller automatiquement les modifications de fichiers. Cela peut nécessiter l'installation fswatch (voir install.md). Vous pouvez également exécuter make watch-release pour construire en continu la construction de version (prend plus de temps par construction).
Pour obtenir une construction propre, vous devrez peut-être:
Clone le référentiel (si vous ne l'avez pas fait) et entrez la racine du projet de votre projet Hazel cloné.
git clone [email protected]:hazelgrove/hazel.git
cd hazel Configurez un environnement OCAML local spécifique au projet et compilez. Si vous avez configuré un environnement OCAML local (il y a un répertoire appelé _opam ), vous voudrez peut-être d'abord le supprimer.
# opam switch remove ./
opam switch create ./ 5.2.0
eval $( opam env )
make deps
makeCela met en place un environnement OCAML autonome dans le projet cloné, indépendant de celui que vous avez envoyé dans votre répertoire domestique. Cela vous permet d'alterner des dépendances ou des modifications des dépendances de test, sans affecter les projets OCAML existants.
Remarque: vous pouvez voir l'avertissement suivant lors de la construction:
Warning 58 [no-cmx-file]: no cmx file was found in path for module Ezjs_idb, and its interface was not compiled with -opaque
Cela est dû à un problème de bibliothèque en amont et ne cause pas de problèmes avec Hazel:
OCAMLPRO / EZJS_IDB # 1
Vous pouvez imprimer à la console du navigateur à l'aide de la fonction standard print_endline . C'est probablement la méthode la plus simple en ce moment. La plupart des données dans la base de code ont quelque chose comme [@deriving (show({with_path: false}), sexp, yojson)] sur eux. Cela génère des fonctions d'assistance pour l'impression et la sérialisation de ces données. Pour un type nommé t , la fonction show sera nommée show . Sinon, pour un type nommé autre chose comme q , ce sera show_q .
Les cartes source pour js_of_ocaml doivent être configurées lors de la fabrication locale avec le profil de développement ( make ). Ceci est configuré à l'aide des strophes Env présents dans les fichiers dune pour chaque répertoire de niveau supérieur.
Étant donné que les cartes source sont générées par le développeur de navigateurs devraient afficher le code de la raison dans le débogueur et l'arborescence source. Les traces de pile doivent également inclure les numéros de ligne de raison.
Si Hazel est accroché à la charge ou lorsque vous effectuez certaines actions, vous pouvez charger le mode de débogage en ajoutant #debug à l'URL et en rechargeant. De là, vous avez des boutons qui modifieront les paramètres ou réinitialiseront le stockage local. Actualisez sans le drapeau #debug et j'espère que vous pourrez résoudre la situation à partir de là.
Vous pouvez exécuter tous les tests unitaires situés dans test en exécutant make test .
Les tests unitaires sont écrits à l'aide du cadre Alcotest.
La couverture du code est fournie par BISECT_PPX. Pour collecter les statistiques de couverture des tests exécutés, make coverage . Une fois les statistiques de couverture générées, les exécutions make generate-coverage-html générera une page Web locale sur _coverage/index.html qui peut être consultée pour voir la couverture linéaire par module.
Lorsque vous poussez votre branche vers le référentiel principal hazelgrove/hazel , nous avons une configuration d'action GitHub (voir .github/workflows/deploy_branches.yml ) qui créera cette branche (en mode release ) et le déploiera dans l'URL https://hazel.org/build/<branch name> , en assumant la construction succède.
Cela prend généralement environ 2 minutes si le cache de construction de l'environnement frappe, ou plus de 20 minutes, sinon. Vous pouvez afficher l'état de la construction dans l'onglet Actions sur GitHub.
Les constructions avant juillet 2024 sont archivées à https://hazel.org/build/<branch name> .
Remarque: Si une autre archive doit être effectuée, assurez-vous de redéployer les branches suivantes manuellement car nous nous référons à eux dans divers documents publics (sites Web et articles publiés):
Dev Livelits