Alchemy

From Esolang
Jump to navigation Jump to search

Overview

Alchemy is an esoteric programming language created by User:EvincarOfAutumn in April 2008.

Each Alchemy program consists of a series of "reactions", which perform arithmetic operations and I/O, numeric line labels, and conditional jumps to those labels. Comments are given in parentheses.

Elements

Variables in Alchemy are called "elements". Elements have the following properties:

  • Element names are alphabetic.
  • Element names must begin with a capital letter.
  • The names of water-soluble elements begin with Aqua.
  • The names of dry elements end with ius.
  • The names of wet elements end with ium.
  • Each element has a "substance number" equal to the sum of the ASCII character values in its identifier.

Predefined Elements

The following elements will be defined at the start of an Alchemy program, and will have the indicated initial values. This is a work in progress and will arrive later.

Steps

Steps may be given numeric labels with a declaration of the form:

Step Number:

Where Number is an integer.

The programmer may conditionally jump to a label:

ElementName? Number

If ElementName is nonzero, then program execution jumps to Step Number.

Reactions

The general syntax of a reaction is:

ProcessName ElementList (Solvent):  ProductName

Where ProcessName is the alchemical process to be performed, ElementList is a list of the names and amounts of the elements used in the reaction, Solvent defines which solvent to use for the reaction, and ProductName indicates the element to which the result of the reaction should be stored.

Processes

I/O

Process name Element effect
Digest Inputs a value for each element.
Multiply Outputs the value of each element.

Arithmetic

Process name Element Effect
Project Calculates the sum of all elements.
Ferment or Putrefy Subtracts all following elements from the first.
Fuse Calculates the product of all elements.
Calcinate Divides the first element by all following.
Cerate Decrements the first element and returns it.
Fixate Truncates the first element and returns it.
Sublimate Calculates the bitwise OR of all elements.
Distill Calculates the bitwise AND of all elements.
Filter Calculates the bitwise inverse of the first element.
Congel or Coagulate Calculates the arithmetic mean of all elements.

Element Lists

An Element List is of the form:

Number Unit ElementName, Number Unit ElementName, ...

Where Number is an integer number; Unit is dr (drams) for dry elements or oz for wet elements; and ElementName is an identifier.

Solvents

The general form of a solvent declaration is:

Number oz SolventName

Where Number is an integer and SolventName is either Water or Alkahest. Water may only be used as a solvent if all of the elements in the reaction are water-soluble. Alkahest is a universal solvent, but it may be used only in an amount equal to its substance number (813) times the number of ingredients in the reaction. If this amount is exceeded by a reaction, then the reaction immediately following must not use Alkahest.

The amount of solvent used for a reaction must exactly be equal to the amount required for the ingredients. Dry ingredients require 1 oz Alkahest or 2 oz Water per dram, and wet ingredients require 2 oz Alkahest or 3 oz Water per ounce.

Explosions

Every error that can occur in a program as a direct result of the programmer's carelessness causes an Explosion. All Explosions are fatal. The interpreter deletes all files in the same folder as any source file that Explodes.

The following Explosions are currently defined:

  • Substance Explosion - Element amounts do not produce the same values.
  • Insufficient Alkahest Explosion - The reaction attempted to use Alkahest when the supply was depleted.
  • Insolubility Explosion - Not all given elements are soluble in water.
  • Excessive Solvent Explosion - Too much solvent was supplied for the reaction.
  • Insufficient Solvent Explosion - Not enough solvent was supplied for the reaction.
  • Ambiguous Step Explosion - Attempted to declare a duplicate line label.
  • Undefined Step Explosion - Attempted to jump to a nonexistent line label.

Examples

Snippets

The following commented snippet computes the product of Mercurius and Saturnium and stores the result in Aquariatus.

( Mercurius has a substance number of 959. )
( Saturnium has a substance number of 968. )
( The least common multiple of 959 and 968 is 928312. )
( The amount of Mercurius required is 928312/959 or 968 drams. )
( The amount of Saturnium required is 928312/968 or 959 drams. )
( Mercurius is dry, so it requires 1 oz Alkahest per dram. )
( Saturnium is wet, so it requires 2 oz Alkahest per dram. )
( The amount of Alkahest required is 1*959+2*968 or 2895 ounces. )
( The amount of Alkahest used is greater than the substance of Alkahest(813), )
( times the number of elements (2), so the supply of Alkahest is depleted. )
( The product should therefore be water-soluble, )
( so the next reaction doesn't try to use Alkahest. )

Fuse 968 dr Mercurius, 959 dr Saturnium (2895 oz Alkahest):  Aquariatus

Full Examples

(I don't have all day!)

External resources