Changelog
Source:NEWS.md
arl 0.1.4
CRAN release: 2026-03-19
Performance
- Reduce CRAN test runtime via uniform test thinning: on CRAN, run every 3rd test block per file (controlled by
make_cran_thinner(keep_every = 3L)), cutting ~67% of per-test work while keeping full coverage off CRAN. - Reduce TCO test recursion depth on CRAN (6000 vs 10000) to further cut runtime while still validating tail-call optimization well beyond R’s default stack limit.
arl 0.1.3
CRAN Compliance
- Remove “for R” from package title per CRAN policy.
- Replace bare
cat()calls with S3 print methods (arl_cli_output,arl_help_doc,arl_coverage_report) so console output follows CRAN guidelines. - Require explicit
output_fileargument inreport_html()andreport_json()— no longer write to the working directory by default. - Convert example vignette code chunks from
{r}read-and-cat wrappers to arl chunks that execute via the knitr engine.
arl 0.1.2
Performance
- Pre-build vignettes in the tarball using the
.Rmd.orig+ stub pattern, cutting ~110s fromR CMD checkvignette rebuild time. - Speed up test suite by avoiding stdlib prelude loading in tests that don’t need it.
- Reduce TCO test recursion depth to reduce runtime while still checking deeper recursion than R’s defaults allow.
arl 0.1.1
Bug Fixes
- Fixed stale module cache poisoning when ambient macros differ between sessions. The module cache now computes a fingerprint of all macros visible in a module’s parent environment chain (not just the prelude) and invalidates entries when macros change.
- Fixed missing dependency declaration in
looping.arl. - Fixed Windows backslash path handling in tests.
- Fixed
FileDepstests to work duringR CMD check. - Fixed bad URLs in README and vignettes.
- Included vignette files in built tarballs (
.Rbuildignorefix).
arl 0.1.0
Initial release of arl, a Scheme-inspired Lisp dialect embedded in R.
Language
-
Special forms:
quote,if,define,set!,lambda,begin,defmacro,quasiquote/unquote/unquote-splicing,and,or,while,delay,import, andmodule. -
Truthiness:
#f,#nil, and0are falsy; everything else is truthy. - Cons cells: First-class dotted pairs, with both cons-cell and R-native list representations.
-
Destructuring: Pattern destructuring in
define,set!,let, andlambda, including nested patterns, rest parameters, and defaults. -
Multiple values:
valuesandcall-with-values. -
Continuations:
call-ccvia R’s nativecallCC.
Macro System
- Compile-time code transformation with quasiquotation templates.
- Hygiene via
gensymandcapture. - Introspection with
macro?,macroexpand,macroexpand-1, andmacroexpand-all. - Documentation attachment via
;;'comments.
Module System
- Named and anonymous modules with explicit or
export-allexports. - Qualified access via
/syntax (e.g.math/inc). - Import modifiers:
:refer,:as,:rename,:reload. - Modules are first-class environment objects with locked bindings.
- Re-export support, circular dependency detection, and module caching.
- Introspection:
module?,module-name,module-exports,module-ref.
Compiler
- Single-pass compilation from Arl to R expressions.
- Self-tail-call optimization: rewrites self-recursive functions in tail position as
whileloops. - Constant folding, dead code elimination, strength reduction, identity lambda elimination, boolean flattening, and arithmetic infix compilation.
Standard Library
22 modules (~800 definitions) auto-loaded via a prelude:
-
Core and logic:
when,unless,cond, error handling, identity. -
Types and equality: Full suite of type predicates;
equal?,eqv?,eq?. -
List and sequences:
append,reverse,take,drop,nth,range,repeat,cycle,zip, and more. -
Functional:
map,filter,reduce,fold,compose,partial,juxt,complement,constantly. -
Control flow:
try-catch,finally, condition signaling and handling. -
Binding forms:
let,let*,letrecwith destructuring. -
Threading macros:
->,->>,as->,some->,some->>,cond->,cond->>. -
Looping:
until,do-list, Clojure-styleloop/recur. -
Math:
inc,dec,abs,sqrt, trigonometric functions, and more. -
Strings:
str,string-concat,string-split, and friends. - I/O: File reading/writing, display, and formatting.
-
Data structures: Hash-backed
dictandsettypes with full operation suites;defstructmacro for S3-backed record types. -
Sorting:
list-sort,sort-by,merge-sorted,stable-sort. -
Assertions:
assert-equal,assert-true,assert-false, and others.
R Interoperability
- Direct access to all R base and default-package functions.
- Keyword arguments (
:name value), formulas,$,[,[[, and@. -
r-evalandr-callfor dynamic R evaluation. - Bidirectional data exchange: define R objects into Arl, extract results back to R.
- Configurable R package visibility.
Developer Tools
- REPL: Interactive prompt with multi-line input, readline history, bracketed paste, and error recovery.
-
CLI: Script execution,
--evalexpressions, quiet mode, bare engine mode, and stdin support. -
Help system:
(help topic)dispatches to special forms, builtins, stdlib docstrings, or R help.docanddoc!for programmatic access. - Coverage tracking: Line-level and branch-level instrumentation with console, HTML, and JSON reports.
- Knitr engine: arl code chunks in R Markdown with persistent engine state and syntax highlighting.