»

Localized Programming Language

Citrine Programming Language


Citrine is a very simple programming language that you can use in your native language! With Citrine you can easily create your own apps and games and share them with friends! You can also export your own creations as stand-alone executables on computers, smartphones, game consoles or the web.
Learn Citrine in a minute.

Latest News

Roadmap 2024: Media plugin
Pre-order the Citrine Book!
French homepage! (thanks Mario Périard)
Translation Kit Update
Citrine 0.9.5 Sorghvliet released!
More news »


Note: This website is also served over non-HTTPS because some visitors have to rely on caching proxies due to poor internet connectivity in their countries.


 

Features


 

Localized

Allows everyone to code in their native language. Making code more accessible and expressive. We aim to support every human language on earth! (EGIDS-6)

 

Simple

Simple, minimalistic: just 5 grammar rules!
No if/for/while-syntax, no data types, no classes. Really simple to learn and remember, yet powerful.

 

Uniform

One programming language to rule them all. Citrine eliminates all sub-languages. No more regex, HTML or SQL. Just one language to learn.

 

Manual

Citrine is very easy to learn, you create a program by sending messages to objects. There are 3 types of messages: unary (no arguments), binary (one argument) and keyword messages (one or more arguments),
here's how:

☞ x ≔ ‘Hello’ length.
☞ x ≔ 3 + 7.
☞ x ≔ Number between: 0 and: 10.

We use to declare a new variable. In the second example we send a message +7 to 3, the resulting object will be 10. There is no need for if, while or for statements, to execute code conditionally send true: to a boolean, to run code in a loop, multiply the task by sending ×:

(x ≥ y) true: { ✎ write: ‘buy!’. }.
{ :i ✎ write: i. } × 3.
{ x add: 1. } while: { ↲ x < 9. }.

You can write Citrine in your native language, so, for instance, in Dutch, the third example looks like this:

{ x optellen: 1. }
zolang: { ↲ x < 9. }.

There is no special syntax needed for string interpolation, just send a non-defined message to a string to replace the word specified by the message with the argument:

‘Hola señor!’ señor: ‘Don Quijote’.
Hola Don Quijote!

To create your own object, send new to the main Object, you can also use other objects as a prototype. You can add new logic to all objects with on:do:, even existing ones. There are no classes.

☞ y ≔ Number new.
y on: ‘double’ do: { ↲ ⛏ × 2. }.

Note that refers to the object itself. To store a value as an object property use: , properties are only accessible from within the object itself and its derivatives.

cat on: ‘name:’ do: { :me
	⚿ name ≔ me.
}.

Apart from a few details, that's basically all there is to it! Now you know Citrine! For more examples, open the learn-by-example manual, which is available for all languages supported by Citrine! * Translated manual available


EXAMPLES (ALL LANGUAGES)

Citrine is a localized scripting language. For some languages, we have to rely on machine translations because we haven't found translators yet. We appreciate any help! All natural languages are welcome**, even if they are not very common (EGIDS-status 6). ** Artificial languages, fantasy languages, private languages and other non-natural languages will not be included but you are free to fork the project of course.
Improve Translations

 


Citrine Online Store

book

COMING SOON! Learn more about Citrine, buy the e-book or paperback. The book covers the core language features of Citrine and includes lots of examples as well as some exercises to test your Citrine knowledge! Soon available in: Dutch, English and Russian.

BUY e-BOOK (coming soon) BUY PAPERBACK (coming soon)

export

COMING SOON! With one click you can export your Citrine program to any platform you like! Deploy your app or game on desktop computers, smartphones, the web or game consoles. All platforms will be supported!

BUY Export (coming soon)

consultancy

Do you want development support for Citrine? Do you want to integrate the Citrine Programming Language into your cloud service, online platform or business application? By doing so, you can empower employees to perform complex tasks on their own and automate work. This reduces the cost of (web)interface development and custom code!

BUY CONSULTANCY



Citrine is free and open source, licensed BSD. Download the latest version of Citrine and start developing your own apps and games!

Download Citrine 0.9.5 or grab the source...

Free Extra Tools & Language Supplements Download extra software, tools and language supplements for the Citrine Programming Language.

 

FAQ

Why Citrine?

Citrine is simple, minimalist, localized programming language following the Kayan philosophy1, for developers who prefer to write code in their native language without having English keywords in the mix. Citrine has been engineered specifically to play well with any natural human language. Citrine features a very limited yet flexible (and language agnostic) grammar and lacks unnecessary complex concepts like classes, string interpolation syntax and data-types (everything is an object), making it easy to learn and remember. Citrine also features localized numbers, dates and punctuation. Localization can be seen as the final step in producing a more readable and maintainable programming language. Coding and studying in your own language has been proven to have a positive impact on learning outcomes2 and quality3,4. Citrine can also translate code. Citrine is referenced in relevant scientific literature5. 1. After the Philosophy of American Computer Scientist Dr. Alan Kay (regarded as inventor of Object Oriented Programming) 2. Learning to Code in Localized Programming Languages (MIT) 3. Effects of localization on Exceptions in Java 4. Engelstaligonderwijs slecht voor studie (PDF)   5. Scientific Paper India (PDF)  

What is the purpose of Citrine?

The Citrine Project aims to create (in order of importance) an extremely simple, minimalist, pure object oriented, localized programming language to improve the maintainability of code and lower barriers. Please consider these fundamental principles if you consider to contribute code.

Why is this page in English?

As a developer, you have to know some English. Nobody is going to change that anytime soon. Writing complex logic in a foreign language is something different though. Citrine allows you to put your thoughts into the words of the language you know best: your mother tongue. That being said, if you want to translate a manual page, feel free to help!

Who are the users?

Citrine can be used as a general purpose programming language by developers who wish to improve maintainability and readability by writing minimalist, pure object code in their native language. Citrine also allows you to discuss and explain critical business logic with your customers, thus allowing them to verify its correctness. Also, Citrine can be embedded into serverless cloud or FAAS* platforms as a localized scripting language. Another option is to embed Citrine as localized DSL** for power users in a SAAS-solution***, to lower adoption barriers and reach new audiences. Furthermore, Citrine can be used to teach programming in a language agnostic way at schools and universities. Finally, Citrine is a research project to analyse the impact of localization on programming. *FAAS: Function as a Service **DSL: Domain specific language ***SAAS: Software as a service

Can I contribute?

Sure, Citrine is open source (Licensed BSD1,2) and we can share code using e-mail or Github or other systems. Citrine is written in C. The Citrine Project is apolitical. 1. BSD License explained 2. Citrine Programming Language License on website

Need inspiration?

Here are some suggestions to get you started: a simple game, a password tool (that you can use on all devices), a to-do list, an alternative e-mail system (not like regular e-mail), an alternative browser to visit Citrine programs online (not the web). If you need some inspiration for original game ideas, you can always try to do a remake of a classic game (like this) or you can look at these very obscure ones at the underdogs. Feel creative, you can whatever you want!

Other questions?
Consult the Extended Technical FAQ >.


Why icons in the language?

Abstract, yet frequently used concepts are represented as icons in Citrine. For example, to declare a new variable in a Citrine program you use a pointing finger (☞). The inspiration for this approach comes from Smalltalk-701. Apart from pictograms, Citrine also allows the use of thin space to separate words in object names and message parts to avoid CaMelCase and snake_case. You can use the icons in your code by installing the Citrine font (Citrine.ttf, part of the download package) and using the unicode codes (Linux: CTRL + SHIFT + u), the composition key, the Berlian IDE or a Geany Macro package, see Extended Techical FAQ. Once installed, the icons are quick to type, not verbose and easy to read. Why limit ourselves to the restrictions of archaic ASCII? Also, most people (except those who speak English) already have to use character composition because most natural languages don't have an alphabet that fits on a single keyboard. 1. Smalltalk-72 Manual

What type of scoping does Citrine use?

Citrine uses dynamic scoping, for instance, the following example prints '2':

☞ f ≔ { q ≔ 2. }.
{☞ q ≔ 1. f run. ✎ write: q.} run.
	

Can I use inheritance?

Yes. Assuming we have a Cat object that can print its name, here, we override the behaviour for message 'name' with a new response. The symbol 'plays' back another response from the same object. Sending the same message invokes the overridden behaviour. If you really want recursion (i.e. invoke the code you're currently running) prefix your message with the word 'recursive'.

RoyalCat ≔ Cat new.
RoyalCat on: 'name' do: {
	↲ ‘your royal highness ’ +
	( ⛏ name ).
}.
✎ write: 
((RoyalCat new name: ‘Diva’) name).
your royal highness Diva

What happens if a message is not understood?

If an object does not understand a message, the message will be ignored (Null Pattern). You can intercept those messages though, similar to PHP's magic methods:

echo ≔ Object new.
echo
 on: ‘respond:’
 do: { :s ↲ s + s }.
echo ho!.
ho!ho!
 

About us


Gabor de Mooij
Gabor de Mooij
Core language design & Linux/BSD implementations.
Software developer from the Netherlands.

Aavesh Jilani
Aavesh Jilani
Hindi & Marathi translations (Citrine/HI and Citrine/MR).
Windows, iOS, Android/ARM platform support.
Software developer from India. The creator of Dragon (programming language) and Suasive (search engine).

Roman Litwinow
Roman Litwinow
Russian Translations for Citrine/RU,
Russian Language Supplements,
Russian Citrine Website.
Software developer & Language Consultant from Russia.



Special thanks to:
Marek Majkowski (SipHash; Licensed MIT), Stephen C. Losen (CCGILib; Licensed LGPL), Dave Gandy (Font Awesome; Licensed SIL OFL 1.1), JadedCtrl (Haiku Support), John Calistro (Brazil-Portugese Support), Tirifto (Czech Support), Jan Wicijowski (Polish Support), Twiggler (Windows Support), Jake Russo (Plugins, CURL Lib Support), DennisCGc (Bug fixes & improvements), Takano32 (Various), Leonora Tindall (Bug fixes & improvements), Janus (Bug fixes & improvements), Shinriyo (MacOSX Support), Bernadette Peeters (English language support), Sean Eshbaugh (MacOSX Binaries), Georgel Preput (Romanian Support), Lina Dapkute (Lithuanian Support), Mario Périard (French language support, regional homepage), Muhammad Alvaro Syawal Siregar (Indonesian language support) & Marianne (Editor, Language Consultant).

contact: gabordemooij at gaborsoftware dot nl