ETamil
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.
Overview
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.
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.
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:
A conditional, reading an income and applying a tax rate above a threshold:
Error handling with result values; ? returns the failure to the caller:
A record shape with a method computing a loan's equated monthly installment:
Iteration over an array of records, using the standard library's rupee formatting with Indian digit grouping:
An HTTP route returning JSON:
Libraries
eTamil's standard library, nUlakam (from நூலகம், "library"), is written in eTamil rather than in the host language. Its general-purpose modules cover strings, mathematics, arrays, records, dates and working-day calendars, JSON, Base64 and hexadecimal encoding, document templating, and a unit-testing framework whose failures produce a non-zero exit status for use in continuous integration. Its domain modules include:
Accounting – a chart of accounts, journal and ledger with a balance check, Goods and Services Tax entries, accounting periods, multi-entity and foreign-currency handling, period close, and the trial balance, income statement, balance sheet and cash flow statement. Depreciation, payroll and tax – straight-line and written-down-value depreciation, payroll, and a marginal slab engine for income tax and professional tax. Rates are held in an effective-dated table that is queried by date; the library ships with no rates. Cost accounting – cost sheets, overhead absorption, standard costing variances, cost–volume–profit analysis, process costing and activity-based costing. Revenue recognition – the five steps of Ind AS 115, the Indian counterpart of IFRS 15. Project control – work breakdown structures, earned value, the critical path, risk registers and three-point estimation. Banking, insurance and customs – simple and compound interest, loan installments, asset classification, insurance claim settlement including the average clause, and the customs duty cascade. Payments and ledgers – Unified Payments Interface address validation, payment links and a payment state machine, and a client for Hyperledger Fabric. The runtime also provides database drivers for SQLite, PostgreSQL, MySQL and MariaDB, MongoDB and Redis, in which queries are always parameterised; outbound HTTP; HMAC-SHA256, ECDSA P-256, bcrypt and JSON Web Token support; mutual TLS; and reading and writing OpenDocument and Office Open XML files.
Wikipedia contributors · ETamil · revision 1378158960 · CC BY-SA 4.0 · Plain text extracted and formatting adapted; tags derived from linked topics.