eTamil is a high-level programming language whose keywords are words of the Tamil language. It is designed as a domain-specific language for Indian accounting, taxation and financial technology, and also provides the features of a general-purpose programming language, including first-class functions, user-defined record types, modules, database access and an HTTP server.
Financial concepts are part of the language's vocabulary rather than a library: (credit), (debit), (tax) and (balance sheet) are keywords. Every number is a fixed-point decimal, so that 0.1 + 0.2 evaluates to exactly 0.3. Each keyword may be written in Tamil script, in an ASCII romanization, or for most keywords with an English alias.
eTamil was created by Esan Maruff. It first appeared on GitHub in June 2024, and its current implementation dates from January 2026. Its reference implementation is written in Rust and includes a bytecode virtual machine and an experimental LLVM back end. Its standard library, nUlakam, is written in eTamil itself.
History eTamil is the work of Esan Maruff (legal name Mohammed Maruff). It first appeared publicly on 26 June 2024 as eTml, a GitHub repository describing "an Indian DSL for Accounts & FinTech" with an early implementation in Rust. On 5 July 2024 it was followed by the eTamil repository, which held a prototype compiler, with a lexer, parser, semantic analyser and code generator, together with the project's website at etamil.in.
Maruff enrolled as a PhD scholar in the Department of Computer Applications at B. S. Abdur Rahman Crescent Institute of Science and Technology, Chennai, to document the language's approach, under the title "Developing an Indian DSL (Programming Language) for Accounts, Commerce, Finance, and Fintech Professionals". A paper of the same title was presented at the International Conference on Technology Enhanced Teaching and Learning (ICTETL 2025), held online on 23–24 October 2025 by the institute's Centre for Distance and Online Education in collaboration with Global College Malta, and published in the conference proceedings.
Over the following two years the language was developed in a series of separate repositories, each covering one part of the project or trying a different architecture. Among them were eTamil-ciRal, a framework of tools and libraries (August 2024); eTamil-nivaqi (September 2024); Accounts, an accounting module in Rust (February 2025); nivaqi-v1 (March 2025); and eTamil-Compiler, eTamil-vscode and eTamil_transpiler (January and February 2026). All were superseded by the current repository, first published on 26 January 2026 with a compiler and a Visual Studio Code extension providing syntax highlighting. Version 0.2 followed on 31 January 2026, adding documentation for the language's transliteration scheme. The original eTamil repository was not discarded, because it hosts the project's website; only its Rust compiler code was removed, in August 2026.
The language was substantially reworked in August 2026. Binary floating-point arithmetic was replaced throughout by fixed-point decimals, the financial and accounting vocabulary grew from 157 to 196 keywords, and functions, arrays, records, iteration, result types and modules were added, together with database access and an HTTP server.
Version 1.0.0 was released on 13 September 2026, with prebuilt packages for Windows, Linux and macOS and a Visual Studio Code extension that bundles the full toolchain. Versions 1.0.1 to 1.0.3 added a bundled typeface released under the SIL Open Font License. Version 1.1.0, released on 23 September 2026, added immutable bindings, first-class functions, record shapes and methods. Version 1.2.0 added a package for the Raspberry Pi and other 64-bit ARM Linux systems, and made .qmz the only source-file extension; version 1.3.0 added compilation of programs to firmware for Arduino boards; and version 1.4.0 added a library for document retrieval and language models, written in eTamil. Version 1.4.2, released on 28 September 2026, carried security updates to two dependencies.
+ Major releases Version Release date Principal changes 1.4.2 28 September 2026 Security updates to two dependencies 1.4.0 27 September 2026 nuNNaRivu, a retrieval and language-model library written in eTamil; a file-system library 1.3.0 27 September 2026 artino: programs compiled to firmware for Arduino boards 1.2.0 27 September 2026 Package for Raspberry Pi and 64-bit ARM Linux; .qmz as the only file extension 1.1.0 23 September 2026 Immutable bindings (), functions as values and closures, record shapes () with methods; map, filter and fold in the standard library 1.0.0 13 September 2026 First stable release; database writes from compiled programs; installable packages for three operating systems 0.2 31 January 2026 Token corrections; transliteration documentation — 26 January 2026 Current repository published: compiler and editor extension — 5 July 2024 eTamil repository: prototype Rust compiler and website — 26 June 2024 First public repository, eTml
Design philosophy and features eTamil's design documents state that the language should let Tamil-speaking accountants and programmers express financial logic in their own language, without being a translation of an English-keyword language. The project describes several fixed principles:
Exact money. Every value is a 28-digit fixed-point decimal and binary floating point is never used, so that a double-entry ledger balances exactly. Division keeps full precision and rounding is explicit, following the Indian tax practice of rounding once at the end of a computation. Loud failure. Unsupported constructs, undefined variables, division by zero and out-of-range indices raise errors rather than producing a default value. The project's rationale is that a silently wrong result from a tax calculation is worse than a crash, because a successful run is not investigated. Errors as values. Following Rust, operations that can fail return (success) or (failure), propagated with a ? operator. The language has no exceptions. A thin host. Only what the language cannot express, such as system calls, database drivers and decimal and calendar primitives, is implemented in Rust. The standard library and the accounting framework are written in eTamil, which the project presents as evidence that the language is sufficient for the frameworks built on it. Names as written. An identifier is stored exactly as the programmer typed it, so a Tamil author's chosen names are never replaced by English equivalents.
Error messages are bilingual, in Tamil and English, and report a line and column. Columns count written Tamil letters rather than bytes.
Syntax and semantics eTamil uses braces to delimit blocks and semicolons to end statements; these and much of the rest of its syntax were evaluated against C, C++ and Rust before being finalised, and a few keywords were adopted from Ezhil. Unlike most brace-delimited languages, eTamil places a condition before its keyword: (x > 0) எனில் { … } reads as "(x > 0) if { … }".
Keywords and scripts The language has 203 keywords, accepted in 545 spellings in total. Each keyword has a Tamil-script form and a romanized form in the project's ezuqqu scheme, which maps each Tamil letter to ASCII characters so that programs can be typed on an ordinary keyboard. The scheme keeps the three Tamil nasal consonants distinct: is written N, n and Z. Most keywords also have an English alias beginning with an underscore, such as _if.
+ Selected keywords Tamil Romanized Alias Meaning eZil _if conditional iZREl _else alternative branch cuRRu _loop loop while a condition holds ... ovvoru ... il _each ... _in iteration over an array, record or string ceyal _fn function definition qirumpu _return return from a function nilY _const immutable binding vativam _shape record shape declaration iRakku _import import a module accu _print print a value / / mey / poy / iZmY _true / _false / _null Boolean and null literals
Type keywords and SQL clause keywords are reserved. Financial keywords are not, so (amount) may be used as a variable name. Because names are stored as typed, வருவாய் and its romanization varuvAy are different variables, although as keywords the two spellings are interchangeable.
Statements and control flow eTamil's statements include: assignment with =, and the statement, which binds a name once; reassigning it or changing an element or field of its value is rejected before the program runs; the and conditional statements; the loop, which repeats while its condition holds, and the ... loop over arrays, records and strings; function definitions and the statement; , which imports a module, resolving the path beside the importing file and then along an ETAMIL_PATH environment variable; , which declares an HTTP route, and , which sends a response; , which runs a block repeatedly at a fixed interval under the HTTP server.
Expressions Arithmetic uses the usual infix operators. A number followed by % is a percentage, so 18% is the value 0.18. Strings are concatenated with &. The logical operators (and) and (or) short-circuit, and is logical negation. Comparisons chain, so a > b > c is equivalent to testing each neighbouring pair.
Arrays are written […] and records {…}. Arrays compare equal element by element and records field by field. A function written where a value is expected, செயல்(x) { திரும்பு x * 2; }, is an anonymous function; one created inside another function captures copies of the local variables it uses.
Typing eTamil is dynamically typed, with optional type declarations that are enforced. A variable, parameter or return value may be declared as a number (), string () or function (). The checker is deliberately narrow and makes no claim about undeclared values, so that working programs are not rejected by guesses.
A declares a record shape: its fields and the type each holds. A record made as that shape must supply every field and no others. Errors that can be seen in the source are reported before execution; values known only at run time, such as database rows, are checked when the record is made. Functions declared inside a shape are its methods. A method whose first parameter is ("this") is called on a record and cannot modify it, comparable to Rust's &self; a changed record is a new value. There is no inheritance.
Arithmetic operations All numbers are fixed-point decimals with up to 28 significant digits; the language has no separate integer or floating-point types. Equality between numbers is exact. Division retains full precision, and the built-in rounds to a given number of decimal places. When stored, money keeps its exactness: PostgreSQL columns use NUMERIC, MongoDB documents use Decimal128, and SQLite stores decimals as text.
Function syntax A function is declared with , a name, a parenthesised parameter list and a block. Parameters and the return value may carry declared types. Functions support recursion and local scope, and are values: they may be stored in variables, arrays and records, passed as arguments and returned.
Code examples "Hello, World!" program:
அச்சு "வணக்கம், உலகம்!";
Exact decimal arithmetic, with the output of each line shown in a comment:
அச்சு 0.1 + 0.2; // 0.3 அச்சு 99.99 * 3; // 299.97 அச்சு 18%; // 0.18
A conditional, reading an income and applying a tax rate above a threshold:
எண் வருவாய்; அச்சு "வருமானம்: "; உள்ளிடு வருவாய்; வரி = 20%;
(வருவாய் > 800000) எனில் { அச்சு (வருவாய் - 800000) * வரி; } இன்றேல் { அச்சு "வரி இல்லை"; }
Error handling with result values; ? returns the failure to the caller:
செயல் வகு(மேல், கீழ்) { (கீழ் == 0) எனில் { திரும்பு தவறு("பூஜ்ஜியத்தால் வகுக்க முடியாது");
திரும்பு சரி(மேல் / கீழ்); }
செயல் சராசரி_விலை(மொத்தம், எண்ணிக்கை) { ஒன்று = வகு(மொத்தம், எண்ணிக்கை)?; திரும்பு சரி(வட்டமிடு(ஒன்று, 2)); }
அச்சு சராசரி_விலை(1000, 3); // சரி(333.33)