{"id":14235694,"url":"https://github.com/yuriy-chumak/ol","last_synced_at":"2025-04-12T18:42:20.211Z","repository":{"id":20453769,"uuid":"23730921","full_name":"yuriy-chumak/ol","owner":"yuriy-chumak","description":"Otus Lisp (Ol in short) is a purely* functional dialect of Lisp.","archived":false,"fork":false,"pushed_at":"2024-10-29T08:34:00.000Z","size":115900,"stargazers_count":222,"open_issues_count":5,"forks_count":11,"subscribers_count":14,"default_branch":"master","last_synced_at":"2024-10-29T09:52:31.813Z","etag":null,"topics":["c","compiler","ffi","interpreter","language","lisp","ol","olvm","otus-lisp","owl-lisp","programming-language","r7rs","r7rs-scheme","repl","scheme","tiny","virtual-machine"],"latest_commit_sha":null,"homepage":"http://yuriy-chumak.github.io/ol/","language":"Scheme","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yuriy-chumak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-09-06T09:09:48.000Z","updated_at":"2024-10-29T08:34:04.000Z","dependencies_parsed_at":"2023-09-24T19:47:00.932Z","dependency_job_id":"9bdecd84-9bf4-4a8a-a047-087d74d7fd63","html_url":"https://github.com/yuriy-chumak/ol","commit_stats":{"total_commits":4008,"total_committers":17,"mean_commits":"235.76470588235293","dds":"0.24076846307385225","last_synced_commit":"275972e0d07dc89fa15311d3e0f81b18f2166c9e"},"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriy-chumak%2Fol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriy-chumak%2Fol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriy-chumak%2Fol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yuriy-chumak%2Fol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yuriy-chumak","download_url":"https://codeload.github.com/yuriy-chumak/ol/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247070928,"owners_count":20878586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","compiler","ffi","interpreter","language","lisp","ol","olvm","otus-lisp","owl-lisp","programming-language","r7rs","r7rs-scheme","repl","scheme","tiny","virtual-machine"],"created_at":"2024-08-20T21:02:17.084Z","updated_at":"2025-04-03T20:12:56.929Z","avatar_url":"https://github.com/yuriy-chumak.png","language":"Scheme","funding_links":[],"categories":["Scheme"],"sub_categories":[],"readme":"```\n                  small,\n        `___`         embeddable\n        (O,O)             and\n        \\)  )          purely\n      ---\"-\"---     functional!\n  O t u s   L i s p\n```\n*Based on Aki Helin's [Owl-Lisp](https://gitlab.com/owl-lisp/owl)*\n\n[![Github build linux status](https://github.com/yuriy-chumak/ol/workflows/build%20linux/badge.svg)](https://github.com/yuriy-chumak/ol/actions/workflows/build-linux.yml)\n[![Github build macos status](https://github.com/yuriy-chumak/ol/workflows/build%20macos/badge.svg)](https://github.com/yuriy-chumak/ol/actions/workflows/build-macos.yml)\n[![Github build windows status](https://github.com/yuriy-chumak/ol/workflows/crossbuild%20windows/badge.svg)](https://github.com/yuriy-chumak/ol/actions/workflows/build-windows.yml)\n\u003ca href=\"https://twitter.com/otus_lisp\"\u003e\u003cimg align=\"right\" src=\"https://img.shields.io/twitter/url/https/twitter.com/otus_lisp.svg?style=social\u0026label=Follow%20%40otus_lisp\"\u003e\u003c/a\u003e\u003c/br\u003e\n\u003ca href=\"https://mastodon.social/@otus_lisp\"\u003e\u003cimg align=\"right\" src=\"https://img.shields.io/mastodon/follow/111901537687270934\"\u003e\u003c/a\u003e\u003c/br\u003e\n\n\nOtus Lisp, Version 2.6\n======================\n[![Visit the project page](https://yuriy-chumak.github.io/ol/assets/view-project-page.svg)](https://yuriy-chumak.github.io/ol/)\n\nOtus Lisp (Ol in short) is a purely functional dialect of Lisp.\n\nOl implements an extended subset of the R\u003csup\u003e7\u003c/sup\u003eRS Scheme\n([PDF](https://small.r7rs.org/attachment/r7rs.pdf)), including\nbut not limited to some SRFIs. It's tiny (~ 64KB), embeddable,\nand cross-platform;  provides a portable, high-level interface\nto call code written in another language (c, python, lua, etc).\n\nYou can use Ol on Linux, Windows, macOS, Android, Chromebook*,\n(Open/Free/Net) BSD, Solaris and other operating systems based\non various hardware architectures (intel, arm, ppc, mips, etc).\n\nAlso, Ol is ported to the web (in WebAssembly form) and can be\nused in Chrome, Safari, Firefox, Edge, Opera, etc.\n\n* credits to:\n[the-man-with-a-golden-mind](https://github.com/the-man-with-a-golden-mind) (ideas, usage, lot of tests),\n[nullscm](https://github.com/nullscm) (usage, tests),\nOdysseus (tests, ideas, math corrections),\nmt (tests, ideas).\n* note: please check the [differences](#r7rs-differences) between Ol and Scheme R\u003csup\u003e7\u003c/sup\u003eRS.\n\n\nPACKAGING\n---------\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/ol.svg)](https://repology.org/project/ol/versions)\n[![Packaging status](https://repology.org/badge/tiny-repos/ol.svg)](https://repology.org/project/ol/versions)\n[![latest packaged version(s)](https://repology.org/badge/latest-versions/ol.svg)](https://repology.org/project/ol/versions)\n\n* Ubuntu (and it's descendants such as Mint, Pop!_OS, Xubuntu, etc.) users may use the official [project ppa](https://launchpad.net/~yuriy-chumak/+archive/ubuntu/ol).\n  ```shell\n  $ sudo add-apt-repository ppa:yuriy-chumak/ol\n  $ sudo apt update\n  $ sudo apt install ol\n  ```\n\n* ~~**CentOS**, **Debian**, **openSUSE**, **RHEL**, **SL**, **SLE**, **Ubuntu**, **Univention** precompiled packages: [OpenSUSE Build Service](https://software.opensuse.org/download.html?project=home%3Ayuriy-chumak\u0026package=ol).~~\n\nSome additional libraries can be installed using 'kiss' package manager. Usage instruction available at [**ol-packages** repository](https://github.com/yuriy-chumak/ol-packages).\n\n\nQ/A\n---\n\n1. Q. Some folders **are empty** (i.e. \"libraries/OpenGL\"), is it ok?  \n   A. Yes, it's ok. Some parts of Ol project are separated into their own independent repositories.  \n      Use `git clone --recursive` to get a full project. Or `git submodule init; git submodule update` to update existing one.\n\n1. Q. Why no **arrow keys** processing and a history in Ol command line?  \n   A. For the gods of simplicity. I recommend to use an [rlwrap](https://github.com/hanslub42/rlwrap) tool  \n      (run as `rlwrap ol` in terminal, or add an `alias ol=\"rlwrap /usr/bin/env ol\"` line to your *~/.bashrc* and run as just `ol`).\n\n1. Q. *.. **fatal error**: stdlib.h: No such file or directory.*  \n   Q. *.. **fatal error**: bits/libc-header-start.h: No such file or directory.*  \n   A. Install gcc `multilib`, i.e. *sudo apt install gcc-multilib*.\n\n1. Q. You reference to licenses **MIT and LGPL**. Can I freely choose between these two licenses?  \n   A. Yes, you are free to choose an MIT or LGPL license.\n\n1. Q. I want to run Ol in **a venv** (Virtual ENVironment). Can I?  \n   A. Yes. Use `--home=yours-venv-folder` command line option ([more about](#virtual-env) venv).  \n      Additionally, you can embed such a venv into the Ol executable itself (the [portable](#portable-form) form).\n\n1. Q. Anything else interesting?  \n   A. Yes, Ol provides **simplest HTTP web-server** for sharing a local folder over an inter/intra-net.  \n      Just type `echo ,load http/server| ol` in command line (or `,l http/server` inside Ol session),  \n      change `ol` to `ol - --port 8080` to use the custom port.\n\n1. Q. Why do you call the characters not \"characters\" but \"runes\"?  \n   A. Because they are *runes* - letters in a wide set of alphabets :)  \n\n1. Q. Do you have something like \"sleep mode\"?  \n   A. You can store the current REPL session with `,save \"filename\"`, just run later `ol filename` to continue saved session.\n\n1. Q. I'm lost in prefix math notation, can you help me?  \n   A. Ol has a special math library that provides infix math notation. Use the `(math infix-notation)` library.  \n   ```scheme\n   \u003e (import (math infix-notation))\n   \u003e (print (infix-notation\n        1 + 2 * 3 - sqrt(4)\n     ))\n   5\n\n   ; '\\\\' is a short for infix-notation\n   \u003e (print (\\\\  1 + 2 * 3 - sqrt(4) ))\n   5\n\n   ; you can review result of transformations with \",expand\"\n   \u003e ,expand (\\\\  1 + 2 * 3 - sqrt(4) )\n   (- (+ 1 (* 2 3)) (sqrt 4))\n   ```\n\n\nJoin the online [gitter.im chat](https://gitter.im/otus-lisp/Lobby).\nAlternatively the Libera.Chat [#otus-lisp](https://web.libera.chat/#otus-lisp) (alternate [lightweight](https://web.libera.chat/gamja/#otus-lisp) web-client) channel is available (the previous Freenode channel is closed).\n\n[The Issues](https://github.com/yuriy-chumak/ol/issues) github page waiting for your bug reports and issues.\n\n\nTABLE OF CONTENTS\n-----------------\n1. [Build/Run/Install](#build--run--install)\n   * [Advanced](doc/BUILD.md)\n   * [Cross-Compilation](doc/CROSS-COMPILATION.md)\n   * [Embedding](#embedding-ol)\n1. [Packaging](#packaging)\n1. [Running](#running)\n1. [Language Reference](doc/reference/README.md)\n   * [R\u003csup\u003e7\u003c/sup\u003eRS Differences](#r7rs-differences)\n   * [Samples, Tests, Learning](#learning)\n1. [Deprecations](#deprecations)\n1. [Hacking](#hacking)\n1. [Lisp sources in binary form](#binary-scripts)\n1. [Files](#files), [Docs](#documentation)\n1. [License](#license)\n\n\nBUILD / RUN / INSTALL\n---------------------\n\n#### BUILD REQUIREMENTS\n\n* GCC 3.2+ / CLANG 3.5+\n* GNU MAKE\n\n\n#### BUILD\n\n```\n$ make\n```\nAdvanced build instructions: [doc/BUILD.md](doc/BUILD.md)\n\n\n#### RUN\n```\n$ ./ol\nWelcome to Otus Lisp 2.6\ntype ',help' to help, ',quit' to end session.\n\u003e \n```\n\nThe Ol binary includes a rich set of features (lists, vectors and bytevectors, ansi and unicode strings, infinite precision math, associative arrays aka \"ff\"s, i/o streams, lazy evaluations, regular expressions, continuations, exceptions, lexer parsers, async functions and actors, etc.) and can be used as a completely standalone.\n\n\n#### INSTALL\n```\n$ sudo make install\n```\n\nNote: by default we use */usr/bin/ol* for Ol binary, and */usr/lib/ol/* folder for Ol libraries.\n\n\n#### UNINSTALL\n```\n$ sudo make uninstall\n```\n\n\nCHANGELOG\n---------\n\n[doc/CHANGELOG.md](doc/CHANGELOG.md)\n\u003ca href=\"https://twitter.com/otus_lisp\"\u003e\u003cimg align=\"right\"\nsrc=\"https://img.shields.io/twitter/url/https/twitter.com/otus_lisp.svg?style=social\u0026label=Follow%20the%20%40otus_lisp%20development%20process%20on%20Twitter\"\nalt=\"Follow the @otus_lisp development process on Twitter.\"\u003e\u003c/a\u003e\n\n\nLEARNING\n--------\n\nThe Otus Lisp language is based on [Scheme R\u003csup\u003e7\u003c/sup\u003eRS](https://small.r7rs.org/) ([PDF](https://small.r7rs.org/attachment/r7rs.pdf)) with minor changes and useful extensions.\n\nYou can find working Ol examples at:\n* [Standard procedures](doc/reference/) list (constantly improving),\n* [RosettaCode](http://rosettacode.org/wiki/Category:Ol) Ol page,\n* [Tests](tests/) and [Examples](examples/) repository folders,\n* Android example code available at [android](examples/android/) folder.\n\n\nAdditionally,\n* \"LogicWire\" and \"Digital rain\" examples demonstrates native libraries direct usage (the [OpenGL](http://www.opengl.org/)):\n  * https://github.com/yuriy-chumak/ol/tree/master/examples/LogicWire ([idea source](https://realhet.wordpress.com/2015/09/02/bitmap-logic-simulator/))\n    \u003cimg src=\"https://raw.githubusercontent.com/yuriy-chumak/ol/master/doc/img/2023-04-10-21-47.gif\" width=\"50%\" height=\"50%\"\u003e\n  * https://github.com/yuriy-chumak/ol/tree/master/examples/Matrix\n    ![\"digital rain\" screenshot](https://raw.githubusercontent.com/yuriy-chumak/ol/gh-pages/assets/ol/digital-rain.png)\n\n* \"Pacman\" sample demonstrates embedding Ol scripts in native \"C\" code - https://github.com/yuriy-chumak/ol/tree/master/examples/pacman  \n  ![\"pacman\" screenshot](https://raw.githubusercontent.com/yuriy-chumak/ol/gh-pages/assets/ol/pacman.png)\n\n* \"Newton dynamics\" sample demonstrates extended native libraries usage (the [newton-dynamics](http://newtondynamics.com), physical simulation engine) with callbacks (C to Lisp automatic translation) - https://github.com/yuriy-chumak/ol/tree/master/examples/Newton.\nYou should have compiled [newton-dynamics.so](https://github.com/MADEAPPS/newton-dynamics) core library.  \n  ![\"newton\" screenshot](https://raw.githubusercontent.com/yuriy-chumak/ol/gh-pages/assets/ol/newton.png)\n\n\nR\u003csup\u003e7\u003c/sup\u003eRS DIFFERENCES\n---------------------------\n\nThe most important differences are:\n\n* Ol is definitely **case sensitive**.\n* Numbers WITHOUT PRECISION considered to be **exact** in Ol, but *inexact* in Scheme.\n  - `integer?` for inexact numbers always returns **#false** in Ol.\n  - note: Use `inexact` function to convert number into inexact form, or prefix number with `#i` directly (like `#i0.123` for inexact 0.123).\n* **No** `set!` in Ol (Ol is purely functional!),\n  - note: Use `define`, `define-values`, `let`, `let*`, `letrec`, and `letrec*` instead.\n  - note: Limited support of `set-car!`, `set-cdr!`, and `set-ref!` functions [are provided](doc/reference/pairs-and-lists.md#set-car), but is not recommended to be used.\n  - note: Inexact numbers can be changed with `vm:set!`, but is not recommended to be used.\n  - note: Dynamic variables are available via `(scheme dynamic-bindings)` [library](doc/reference/dynamic-bindings.md).\n* CHARACTERS in Ol are **small numbers** (aka 'enums'), but special *character* type in Scheme.\n  - note: Ol supports the full Unicode 15.0.0 (2022 Sep 13) character set.\n  - note: To write a character use `write-char`, otherwise you'll write a number.\n* NEGATIVE indices in `substring` are **valid** in Ol (means \"from the end of string\", -1 means a last *rune*).\n* NEGATIVE vector indices are **valid** in Ol (means \"from the end of vector\", -1 means a last element).\n* Ol has **extended form** of `case` (with vectors support),\n* Ol has **extended form** of `if` (with `then` and `else` [keywords](doc/reference/)),\n* Ol has **builtin dictionary** numeric and symbolic keys (the [reference](doc/reference/ffs.md) page),\n* Ol has builtin **regular expressions** (the [reference](doc/reference/regex.md) page),\n* Ol has an awfully **powerful macro system** in addition to Scheme's hygienic one (a brief [notes and examples](doc/reference/macros.md)).\n* `apply` arguments count is **limited to 249** in Ol (use a `fold` otherwise).\n\nThe nearly full differences list can be found in [doc/R7RS-DIFFERENCES.md](doc/R7RS-DIFFERENCES.md).\n\n### Supported SRFI\n* srfi-0 - `cond-expand`, builtin\n* srfi-16 - `case-lambda`, builtin\n* srfi-71 - `(let* ((a b (values..`, builtin\n* srfi-87 - `\u003c=` in `case`, builtin\n\n\nDEPRECATIONS\n------------\n\n* 2.6 -\u003e 2.7 (which is planned, but i'm not sure about)\n  - i'm thinking about changing `(wait ms)` to `(wait s)`, it means the seconds usage instead of milliseconds.\n\n* 2.5 -\u003e 2.6\n  - feature `ol-2.5` changed to `ol-2.6`.\n  - removed deprecated libraries `(scheme srfi-Nnn)`, use `(srfi Nnn)` instead,\n  - i/o scheduler enabled by default for reads,\n  - `write` function made r7rs-compliant,\n  - `(owl format)` moved to `(otus format)`.\n\n* 2.4 -\u003e 2.5\n  - feature `ol-2.4` changed to `ol-2.5`.\n  - `(system args port...)` changed to `(execvp args port...)`. New `(system command)` introduced.\n  - `(OpenGL version-X.Y)` libraries changed to `(OpenGL X.Y)`.\n  - `fft-size-t` changed to `fft-size_t`.\n  - `HAS_...` build variables changed to convenient `HAVE_...`.\n\n* 2.3 -\u003e 2.4\n  - `(ilist ...)` is deprecated. Use `(cons* ...)` instead.\n  - `(interact ...)` from (owl ~~interop~~ async) is deprecated. Use `(await (mail ...))` instead.\n  - `(fork ...)`, `(fork-named ...)`, `(fork-server ...)` is deprecated. Use `(async ...)`, `(async 'name ...)`, `(actor ...)` instead.\n\n\nHACKING\n-------\n\nOl contains built-in tool for inspecting the Otus Lisp language.\n\nYou can use the REPL `,expand` command to expand high-level Ol instructions into low-level (core) Otus Lisp.\n```scheme\n\u003e ,expand (assert (+ 1 2) = 3)\n'(ifeq (equal? ((lambda (g1) g1) (+ 1 2)) 3) #true #true (runtime-error \"assertion error:\" (cons (quote (+ 1 2)) (cons \"must be\" (cons (quote 3) '())))))\n```\n\nYou can use the REPL `,disassembly` (or `,dis`, or `,d`) command to disassemble Otus Lisp functions to the Ol virtual machine instructions.\n```scheme\n\u003e ,dis (lambda () 1)\ntype: bytecode\ncode: (11 1 0 5 14 1 4 24 4 17)\ndisassembly '(length command . args):\n(4 JAF 1 0 5)\n(3 LD 1 4)\n(2 RET 4)\n(1 ARITY-ERROR)\n\n\u003e ,dis (lambda (x y) (+ x y))\ntype: procedure\ncode: #((11 3 0 7 1 1 2 6 2 6 3 17) #\u003c+\u003e)\ndisassembly '(length command . args):\n(4 JAF 3 0 7)\n(4 REFI 1 2 6)\n(3 GOTO 6 3)\n(1 ARITY-ERROR)\n```\n\nRUNNING\n-------\n\nYou can use basic Ol functionality without any installation - just copy the `ol` (`ol.exe` for Windows) binary to any user-accessible path.\n\nBasic functionality includes a rich set of features: lists, vectors and bytevectors, numbers math with unlimited accuracy, strings, associative arrays (named `ff`), i/o streams and files, lazy calculations, regular expressions, asyncs and actors, etc.\n\nAdvanced functionality (i.e. OpenGL support) requires a complete installation of the Ol package:\n  * You can use precompiled binaries and/or installation packages that can be found at the [Releases](https://github.com/yuriy-chumak/ol/releases) announcement page.\n  * or You can manually copy required [libraries](https://github.com/yuriy-chumak/ol/tree/master/libraries) to your OL_HOME or current directory,\n\n\nOl command line is:\n`ol [options] [filename] [arguments]`\n\n* if no filename given ol will use stdin as source\n* if you want to use stdin as source but must provide an arguments, use \"-\" instead\n  * i.e. `echo '(print *vm-args*)' | ol - arg1 arg2`\n* if you want to break vm-options scanning and provide filename like option (i.e. '--version' as a real file name), use \"--\" for 'end-of-option' flag and then a filename\n  * i.e. `echo '(print *vm-args*)' \u003e --version; ol -- --version arg1 arg2 arg3`\n\nOlvm command line options available:\n* `-v`: print olvm version then exit\n* `--version`: print olvm version and licensing information then exit\n\nOl command line options available:\n* `-v`: print ol version then exit\n* `--version`: print ol version and licensing information then exit\n* `--version=...`: overwrite ol version string\n* `--home=...`: overwrite path where to search for the ol libraries\n* `--sandbox`: enable execution in the sandbox (if OS supports)\n* `--sandbox=Nnn`: execution in the sandbox with \"Nnn\" Megs of memory preallocated\n* `--interactive`: force REPL interactive mode\n* `--non-interactive`: disable REPL interactive mode\n* `--embed`: run special reduced REPL for embed usage\n* `--`: end-of-options sign\n\nOl can be executed interactively or in the unattended mode.\n\n#### Interactive mode\n\n```scheme\n$ ol\nWelcome to Otus Lisp 2.2,\ntype ',help' to help, ',quit' to end session.\n; now you in REPL and can play with in\n\u003e (+ 1 2 3)\n6\n; or let's make some factorial calculations?\n\u003e (let factorial ((n 17))\n   (if (= n 0)\n      1\n      (* n (factorial (- n 1)))))\n355687428096000\n; this ends interactive session\n\u003e ,quit\nbye bye :/\n```\n\n#### Unattended mode\n\nGNU/Linux, Unixes, *BSDs, macOS, ...\n```bash\n$ ol scriptname.ol                # text script\n$ ol scriptname.bl                # binary (compiled) script\n$ echo '(print (+ 1 2 3))' | ol\n```\n\nWindows:\n\n```cmd\n\u003e ol scriptname.ol\n\u003e ol scriptname.bl\n\u003e echo (print (+ 1 2 3)) | ol\n```\n\n\nBINARY SCRIPTS\n--------------\n\nOL can execute precompiled scripts. You can compile your script\nusing this code:\n\n```scheme\n(define (main . args)\n   (print \"hello !\")) ; anything you want to compile\n\n(fasl-save main \"out.bl\")\n```\n\nwhere \"out.bl\" is your binary output file name.\nThis code creates binary script that can be executed directly by ol or vm:\n\n```bash\n$ ./vm out.bl\nhello !\n\n$ ./ol out.bl\nhello !\n```\n\n:exclamation: Note: Since version 2.2.1 Ol supports \"constructors\" - functions that are automatically executed when loading the source. This is experimental feature with no name yet, but feature is tested and will be presented as a normal feature in the next build.\n\nConstructors are called in \"use\" order. The order of independent constructors is undefined. If you want to specify the order of such constructors, create a function that uses them as variables in the correct order.\n\nSo, starting from version 2.2.1 you should do:\n```scheme\n(define (main . args)\n   (print \"hello !\")) ; anything you want to compile\n\n(fasl-save (vm:new 63 main) \"out.bl\")\n```\n\nVIRTUAL ENV\n-----------\n\nA virtual environment is an Ol environment such that the libraries and scripts installed into it are isolated from those installed in other virtual environments and your operating system.\n\nUse `--home=folder` or `--home=folder1:folder2:...:folderN` Ol command line option, where ':' is a folder divider. Folder names '.' and '..' are allowed.\n\nThese folders are linked to the Ol's `*path*` global symbol and can be used and changed at runtime freely.\n\nPORTABLE FORM\n-------------\n\nFILES\n-----\n\n* `repl`  - the compiled ol binary interpreter/compiler (olvm bytecode)\n* `src/olvm.c`  - the ol virtual machine source code (C)\n* `includes/ol/ol.h`  - the common ol header (C, not required, just for use as embed)\n* `includes/ol/vm.h`  - the ol virtual machine header (C, not required, just for use as embed)\n* `extensions/ffi.c`  - FFI implementation (C)\n* `lang/*.scm`  - ol repl and compiler source codes (Lisp)\n* `libraries/**.scm` - various OL libraries (Lisp):\n  * `libraries/scheme/core.scm` - r7rs core implementation\n  * `libraries/owl/*.scm` - legacy basic libraries\n  * `libraries/lib/*.scm` - external native library mappings\n  * etc.\n* `tests/**` - some basic automation tests (Lisp, C, Txt)\n* `tests/rosettacode/*.scm` - additional automation tests (Lisp), described at the [Rosetta Code](https://rosettacode.org/wiki/Category:Ol) programming chrestomathy site.\n\n\nEMBEDDING OL\n------------\n\nPlease refer to the [embedding sample README](https://github.com/yuriy-chumak/ol/blob/master/examples/pacman/README.md).\n\n\nDOCUMENTATION\n-------------\n\nPlease refer to the [project page](https://yuriy-chumak.github.io/ol/)\nor check the source codes - libraries/scheme/core.scm\n\n\nLICENSE\n-------\n\nOtus Lisp is available under 2 licenses:\n[MIT License](LICENSE) and\n[GNU ](COPYING)([L](COPYING.LESSER))[GPLv3 License](COPYING).\n\nCopyright (c) 2011-2014 Aki Helin                         \u003cbr/\u003e\nCopyright (c) 2014-2024 Yuriy Chumak                      \u003cbr/\u003e\n\n\n----------------------------------------------------------------------\n\nGrew out of the Owl Lisp by Aki Helin: https://gitlab.com/owl-lisp/owl\n\nThanks to:\n* [the-man-with-a-golden-mind](https://github.com/the-man-with-a-golden-mind) for the tests, ideas, and questions.\n\nResources:\n* http://groups.csail.mit.edu/mac/projects/scheme/\n* http://people.csail.mit.edu/jaffer/Scheme\n* http://r7rs.org\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuriy-chumak%2Fol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyuriy-chumak%2Fol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyuriy-chumak%2Fol/lists"}