Septem Lingua

From Esolang
Jump to navigation Jump to search

Septem Lingua is designed by PSTF. It has 7 basic commands, and every development can add more commands into this language.

Disclaimer

The name of this language literally means 'seven languages,' but it has no direct connection to seven languages. Septem stands for 7, which means this has 7 command.

Development Team

Leader: User:PrySigneToFry(PSTF)

Developers: User:I am islptng, User:Yoyolin0409

1st-batch members: User:Hammy, User:cleverxia, User:Yayimhere

2nd-batch members: User:MihaiEso

Rules

What a coincidence—the rules of this language are seven, and the basic commands are also seven.

  1. Do not add non-computable commands to this language.
  2. Adding joke commands is prohibited. Septem Lingua is a serious language.
  3. Unless otherwise specified, all commands will be treated as functions.
  4. Adding built-in data storage is prohibited. We stipulate that all data in this language must be stored in variables. However, commands are allowed to access registers or memory to implement more complex programs, and it is permissible to add data types or simulate stacks, queues, deques, binary trees, hash tables, etc., through functions.
  5. No memes are allowed to add in the command, nor appear in the description. The purpose of creating this language was not to become worse or more chaotic.
  6. Allow a command to execute other programming languages, but only those that have been implemented, such as Python. Self-evaluation or self-interpretation is allowed, but interpreting unimplemented languages is not permitted.
  7. Allow manipulation of system files, but do not allow a single command to directly damage the system. For example, this command violates this rule: death - Delete all files on the device that is running this command.

Preprocessors

Coincidentally, there are seven preprocessor groups

@rule x <Operator> y

Each item in the x list will be calculated based on the operator and y

@no_tab_on
@no_tab_off

This allows for tab less via a switch, but an "end" statement is still required. It's not recommended unless absolutely necessary.

@import [<module_name> of] <library_name>

Import a library. Things in bracket can be omitted, but if you import entire library you should use library_name.module_name, and if you import all module in the library(can be done by replace module_name by all_public_module) then you just need to use module_name.

@define x y

Define x as y so you can define boolean literal by yourself. This is not simply "let", because it works like #define in C/C++.

@undef x

Delete all the definition of x. (In fact, they are different. You cannot cancel "let" by this, but you can cancel @define by this.)

@operator <operator_name> <lambda> [<type>]

Define a function as operator.

Available types include "no" (like x+y) and "yes" (like int(x,y)). Default is "no". However, note that "no" means you only have two parameters available; otherwise, a ValueError will occur. also see this.

@base_on
@base_off

Allowing the program to support (or no longer support) numbers in other bases. Preset to off.

0x...is hexadecimal

0b...is binary

0o...is octal

(...)[k] is base-k, which is equivalent to (...)k in pseudo-code on the paper. 0x... is equivalent to (...)[16]. k must be less than 64. A complete base-64 table is 0~9 plus A~Z plus a~z plus - plus _. So (_0)[64]=64

Reserved Area

Any form of editing in the reserved area is not allowed unless you want to add operators or forms of data expression.

  • [} {] is a comment block.
  • String literals are quoted in double quotation marks, and single quotation mark is for Rune type.
  • Escaping Sequence is same as in Python.
  • stdin means user's raw input.
  • There is NO boolean literals. Non-empty value is used as true and empty value(for example, 0, or "") is false.
  • List are enclosed in brackets.
  • The list is 0-indexed.

Coincidentally, there are seven reserved area text

Basic Operators

x+y

Return x+y or Return the concatenation of the two strings

x-y

Return x-y

x*y

Return x×y

x/y

Return x÷y

x^y

Return xy

x%y

Return x mod y

x!

Return x's Factorial

Coincidentally, there are seven basic operators

Bitwise Statements List

x&y

X AND Y

x|y

X OR Y

~x

NOT X

x`y

X XOR Y

x>>y

Shift x right by y bits; y must be a positive integer.

x>>>y

Shift x right by y bits and fill with zeros. y must be a positive integer.

x<<y

Shift x left by y bits; y must be a positive integer.

Coincidentally, there are 7 bitwise statements.

Conditional Statements List

x==y

x and y are completely equal

x!=y

x and y are not completely equal

x>y

For numbers, x is greater than y, or for strings/lists, x has an order that is latter than y

x<y

For numbers, x is less than y, or for strings/lists, x has an order that is former than y

x>=y

For numbers, x is greater than or equal to y

x<=y

For numbers, x is less than or equal to y

x<>y

For numbers, x is greater than or less than y

Note: that only numbers can be used in this conditional expression; judging non-numbers will result in False/0.

Coincidentally, there are seven conditional statements.

Command Table

print arg_list, sep <- "", end <- "\n", filename <- "CON"

Output a series of contents separated by sep and ending with end to the file pointed to by filename. By default, filename points to CON, that is, the console.

let x <- y

Let x be y. If x is already defined, then "let" must be omitted. Let x be del means to delete the definition of x created by this command.

label x: 

Define a label.

jump x

Point the code pointer to the corresponding label.

if x then y else z end

Evaluates to y if x is true otherwise z.

while x do y end

Repeatly do y until x is not true.

halt

Halt.

Note: do end is a code block.

Extended Command Table

By PSTF himself

type(x)

Return x after converting it to the corresponding data type. (also see this to know how it this work)

typeof x

Return x's type. (also see this to know how it this work)

lambda <arg_list> do <function_body> end

Function definition. Can be assigned to variable. (also see this to know how it this work)

range(a, b, c)

Generate a list where the first element is a and the last element is b (if nc + a = b where n is an integer), with a growth rate of c.

By Yoyolin0409

Syntax

-x

Return negative x

long x

Return string x's length

x.long

Return list x's length

nop

nop

try:
when <<Error Name>|Error>:
without <<Error Name>|Error>:
whatever:

These are the components of the try block.

They will attempt to execute the code under try: If an error is specified by when:,

the code under when: will execute. If no error is specified by without:,

the code under without: will execute.

The code under whatever: will execute regardless.

All blocks except try are optional.

The word "Error" alone can match all errors.

x[y]

The y-th item in list x.

[x]*y

Used for list content, to make x repeat y times.

ascii_encode(x)

Retrun convert string x to ASCII code's result, The length of x must be 1

ascii_decode(x)

Retrun convert int x to its corresponding ASCII character's result

repr(x)

Ignore the magic word and return the string as it was originally

Other

The following text was supplemented by Yoyolin0409 to make up for any deficiencies:

type

The `type()` syntax supports the following types: string, rune, int, float, and list, but not boolean.

Converting a number to a rune will convert it to its corresponding Unicode character (but not ASCII).

Converting a float to rune involves rounding it to the nearest whole number, then using the remaining value for the conversion.

Converting a string to a rune will extract the first character.

Converting a list to a rune will extract the first item and process it accordingly.

Converting a Boolean to a rune will return "Y" if True and "N" if False.

Converting numbers or float to strings will result in plain strings.

Converting lists to strings will use Python-style string conversion.

Converting Boolean ​​to strings will return "True" if True, and "False" if False.

Converting anything other than a Boolean to a list will result in a list with its contents as items.

Converting a Boolean to a list: If True, the result is [" "] (a list containing empty strings); if False, the result is [] (an empty list).

The correct way to write the `type()` syntax is like int(), rune(), string()

typeof

The `typeof` syntax can return the following types: string, int, list, boolean (for conditional statements only), lambda, media, and float.

Coincidentally, it can detect exactly seven categories.

Note that `typeof` cannot return `rune` because `rune` is actually a single character, i.e., a string.

lambda

The syntax for arg_list is <var1>,<var2>,<var3>...

operator

@operator a lambda x,y do x+y end no
print 1a2
[}output 3{]
@operator b lambda x,y do x+y end yes
print b(1,2)
[}output 3{]

process.eval

The `eval` function works similarly to Python.

If `eval` contains only a single element, it returns a class similar to `typeof`, but with a more unique format, like `"<class:string>"`.

If `eval` contains a conditional expression, it returns the corresponding boolean value. Note that `eval` cannot return a result like `<class:boolean>` because only conditional expressions can produce this result.

If `eval` contains an arithmetic expression, such as "1+1", it returns the result.

If `eval` contains a method, such as "let a <- 1", it returns a special format: "built-in method".

If this built-in method has a specified object, it returns "the built-in method prepared for a".

process.exec

Variables between different `exec` processes are not shared. However, an `exec` process can access variables that have been created externally, but changes to those variables will not affect other `exec` processes.

Error

Supported error types include:

TypeError (request type does not exist),

ValueError (incorrect value type for input method),

NameError (no variable name defined or an unauthorized variable name used),

SyntaxError (e.g., program block not closed, completely invalid syntax),

RuntimeError (an error of unknown cause was found at runtime, which may be a hardware, software, or memory problem),

DivideZeroError (try dividing the number by zero),

TabError (no indentation).

Coincidentally, there are seven types of errors.

Misc

When using `print` to output data, it will first be converted into text before being output.

rune is equivalent to char in other languages.

By Cleverxia

list

[expr|j1 in k1|j2 in k2|...]

these are list comprehensions, evaluates expr for all j1 in k1, j2 in k2,... and put them in a list

[expr1 where expr2|j1 in k1|j2 in k2|...]

this is just like above, but it only keeps expr1 when expr2 is truthy.

[expr1 without expr2|j1 in k1|j2 in k2|...]

only keeps expr1 when expr2 is falsey.

[expr1 ordered_by expr3|j1 in k1|j2 in k2|...]

same as above but sorts the resulting list based on exp3.

[expr1 drops expr2|j1 in k1|j2 in k2|...]

shortcut for [expr1 without expr1==expr2|j1 in k1...]

[expr1 if expr2 else expr3|j1 in k1|j2 in k2|...]

should be self-explanatory

[expr1 with var2=expr2|j1 in k1|j2 in k2|...]

from the "with a=b" block on, expr1 uses expr2 for var2 instead of finding in the global scope. the var2 may be any of the j*'s.

note that there can be only one (or zero) j* in k* blocks.

the "where x", "without x", "drops x", "if y else x" can be chained, so [i where i<8 drops 3 without i<2 if x<7 else 3 drops 4|i in[1,2,3,1,9,7,8,5,4,5,0,6]] is vaid and returns [2,3,5,5,6]

map(x,f)

shortcut for [f(y)|y in x]

filter(x,f)

shortcut for [y where f(y)|y in x]

reverse(x)

reverses x. This will not change x.

sort(x)
sort(x,keyf)

sorts x in inctrasing order. if keyf given, sorts x by keyf(x) increasing. This will not change x.

reduce(x,f)

returns f(f(...f(f(x[0],x[1]),x[2]),...),x[n]).

concat(x,y)

self-explanitory.

find(x,u)

finds the index of u in x, throws a ValueError if u is not found.

Coincidentally, there are seven types of basic list operations and seven types of list comprehensions.

OOP

(that is, class definitions)

class <name> do
 constructor: lambda <arg_list> do <body> end 
 [static] prop1: value1
 [static] prop2: value2
 ...
 [static] ##private_prop1: private_value1
 [static] ##private_prop2: private_value2
 ...
 [static] #protected_prop1: protected_value1
 [static] #protected_prop2: protected_value2
 ...
end

This defines a class. Constructor must be a function or there's a TypeError when newing it.

In-class function may use this to mean the object itself, eg. you can use this.X=1 to set the object's X property to 1.

if a property has the keyword static prepended with it, it becomes static and be the same (immutable) for all instances. you can use {{<classname>.property}} to access the static properties

the property used must be defined in the class, or there's a NameError. You can access properties by object.property. Private properties (starting with ##'s )and protected properties (starting with #'s) can't be directly accessed outside.

You can overload operators by let the property name be operator$ with $ replaced with the operator.

new class_name(...args)

self-explanatory

class X extends Y1,Y2,... do
 <snip>
end

These are class inheritance. inherited classes may access the ancestor classes' protected properties freely (but not private properties).

classes are also types; X(Y) where X is a class name tries to invoke the X.conversion(typeof Y) to Y. if it fails, it tries to invoke Y.conversion_from(typeof X) to X. if it still fails, it throws a TypeError. stringifying is same as converting to strings.

with the OOPextension, typeof can detect custom classes.

misc

"...@[x]@..."

This is string interpolation. the stringified x will be inserted to the string. there can me multiple @[x]@s in a ztring.

and(y,z)
or(y,z)
xor(y,z)

Bit-operations (deprecated; use &|` instead

lambda* <arg_list> do <body> end

Generator functions; the return xs works like yield x in other languages

for i from <start> to <end> [step <step>] do <body> end

A for loop. equal to for(i=<start>;i<=<end>;i+=<step>){<body>}in C++. if step is omitted, it defaults to 1.

for i in <iter> do <body> end

equals to for(i of <iter>){<body>} in node.js or for i in <iter>: body in Python

Built-in Standard Libraries

If this chapter contains too much content, we will move it to Septem Lingua/STL.

math

math.sin(x)
math.cos(x)
math.tan(x)
math.cot(x)
math.sec(x)
math.csc(x)
math.sinh(x)
math.cosh(x)
math.tanh(x)

Returns the result of the corresponding trigonometry functions applied to x where sinh(x)=(ex-e-x)/2, cosh(x)=(ex+e-x)/2, tanh(x)=sinh(x)/cosh(x)=(ex-e-x)/(ex+e-x)

math.arcsin(x)
math.arccos(x)
math.arctan(x)
math.arsinh(x)
math.arcosh(x)
math.artanh(x)

Returns arcsin(x),arccos(x),arctan(x),arcsinh(x),arccosh(x),arctanh(x) respectively

math.atan2(x, y)

Returns arctan(x/y), π/2 if x>0 and y==0, -π/2 if x<0 and y==0, throws ValueError on x=y=0

math.exp(x)

returns ex

math.sqrt(x)
math.cbrt(x)

returns x^(1/2) and x^(1/3) respectively

math.floor(x)
math.ceil(x)
math.round(x)

returns floor(x), ceil(x) and the closest integer to x (tie-break towards 0) respectively

math.log(x[, y])
math.ln(x)
math.log2(x)

the first funtion return logy(x). Leave y blank means return ln(x). the 2nd and 3rd functions are self-explanitory

math.pi

Return π

math.tau

Return τ(also know as 2π)

math.phi

Return ϕ (=(1+sqrt(5))/2)

math.euler [}deprecated, kept for historical reasons{]
math.E

Return e

math.cgamma

returns the euler-mascheroni constant γ≈0.577215664901532860606512090082402431042159335939923598805767234884867726777664670936947063...

math.degree(x)

Convert x to degrees.

math.radius(x)

Convert x to radians.

math.sgn(x)

If x is greater than 0, return 1. If x is less than 0, return -1. If x is 0, return 0.

math.abs(x)

Return |x|

math.copysign(x, y)

Multiply |x| by sgn(y) and output the result.

math.gamma(x)

Return Γ(x). For x∈Z, Γ(x+1)=x!. (Note that the ! operator don't work on floats)

math.beta(x,y)

Returns the beta function B(x,y)=Γ(x)Γ(y)/Γ(x+y)

math.lngamma(x)

returns ln(Γ(x))

math.erf(x)
math.erfc(x)

calculates the (complementary) error function of x. erf(x)=(2/sqrt(π))ʃ0xexp(-t2)dt, erfc(x)=1-erf(x) without precission loss.

math.nPr(x, y)

Return x! / (x - y)!

math.nCr(x, y)

return x! / (y!(x-y)!)

math.frexp(x)

Return the mantissa and exponent of x, as a list of [m, e] where x = m × 2e and 0.5 ≤ |m| < 1.

math.hypot(x, y[, z])

Return sqrt(x2 + y2[+z2]).

math.infinity

Return +∞. Behaves like in IEEE 754 STD.

math.NaN

Return "Not a Number". Behaves like in IEEE 754 STD.

math.ldexp(m, e)

Return m × 2e. That's simply an inverse of frexp.

math.isclose(a, b, abs_tol, rel_tol)

Return whether a is close to b. Two floating numbers are considered as close if |a-b| < abs_tol or |a-b|/max(a,b) < rel_tol. ±∞ are only close to themselves, and NaN does not close to anything, even including NaN itself.

Coincidentally, there are 7 × 7 = 49 items in math library.

random

random.int(x,y)

Return a random int from x to y. x and y must be int.

random.float(x,y)
random.float(x,y,z)

Return a random float number from x to y with z decimal places. x and y can be int or float, but z must be a non-negative int. with z omitted, the function will not round the generated number.

random.item(x)
random.item(x,m)
random.item(x,1,f)
random.item(x,m,f)

Return m random distinct elements from x in a list. x must be a list. with m omitted, return a random item from x. if f=1, then allows the elements to be same.

random.shuffle(x)

Shuffles x, returns the shuffled array. x must be a list and will not be changed.

random.unicode()

Returns a random Unicode character. It will not return C0 control characters, C1 control characters, non-characters, or private areas.

random.seed(x)

Seeds the internal RNG with x's string representation.

random.getseed(x)

Returns the seed used to seed the internal RNG.

Coincidentally, there are exactly 7 functions in the random lib.

string

string.atob(x)

Turns a base64-encoded string x into binary data and return that

string.btoa(x)

Base64 encode a string and return the encoded string

string.escape(x)

returns x, but escaped

string.unescape(x)

unescapes x and returns it. the escape/unescape behave as in node.js v20.16.0

string.hash(x,h)
[}h=<num>|md5|sha265|sha512|crc32{]

Returns x hashed with algorithm h which have to be in "md5","sha256","sha512","crc32", or a number. When x is a number, we calculate the hash with base x, modulo 2^64

string.match(x,y)
string.match_re(x,y)

Returns the position 1st match of y in x (0-indexed). string.match treats y as a normal string but string.match_retreats y as a regular expression.

Coincidentally, there are exactly 7 functions in the string lib.

time

time.time()

Returns current unix timestamp in milliseconds

time.wait(x)

Waits x milliseconds

time.tocomponents(x,t)

Convert milliseconds since the Epoch to a time list [year,month,day,hour,minute,second,weekday,julian day,is_DST,t] expressing local time and returns that. if t==1, uses GMT time instead

time.fromcomponents(x)

the inverse of time.tocomponents

time.strftime(format,x)

this is a bit complex:

  • first, it turns x into a time list if it isn't
  • then, it formats the time list by format format as follows:
Caption text
formatting signs meaning
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
%% a literal %
time.strptime(format,str)

Basicly the inverse of time.strftime, but this function always return a time list

time.asctime(x)

Shorthand for time.strftime("%a %b %d %Y %H:%M:%S %z",x)

Coincidentally, there are exactly 7 functions in the time lib.

statistics_and_file

statistics_and_file.mean(x)
statistics_and_file.mean(...x)

returns the arithmetic mean of x. (here, ...x means a variadic argument, just like in node.js)

statistics_and_file.quartile(q,x)
statistics_and_file.quartile(q,...x)

calculate the q-quartile of x. eg. statistics_and_file.quartile(1/4,x) returns the lower quartile of x.

statistics_and_file.median(x)
statistics_and_file.median(...x)

shorthand for statistics_and_file.quartile(0.5,x)

statistics_and_file.mode(x)
statistics_and_file.mode(...x)
statistics_and_file.sum(x)
statistics_and_file.sum(...x)
statistics_and_file.product(x)
statistics_and_file.product(...x)
statistics_and_file.max(x)
statistics_and_file.max(...x)
statistics_and_file.min(x)
statistics_and_file.min(...x)

these functions are pretty self-explanitory.

statistics_and_file.stdevs(...x)
statistics_and_file.stdevs(x)

calculated the sample (corrected) standard deviation of x.

statistics_and_file.stdevp(x)
statistics_and_file.stdevp(...x)

calculate the population (uncorrected) standard deviation of x.

statistics_and_file.read(x)

If x is a text string, retrieve the file using it as a path. ".." can return to the previous level. The retrieved file is then returned. This file can only be a .txt file or its variants, such as .md, .json, or .py files, which are essentially still .txt files. Otherwise, a ValueError is raised.

statistics_and_file.media(x)

If x is a text string, it is used as a path to retrieve the file. ".." can return to the previous level. The retrieved file is then returned. This file can only be an image, video, or audio file. Currently supported file extensions include "jpg, png, gif, jpeg, mp2, mp3, ogg, wav, bmp, svg" (this is not currently working because to make it work, we must first create six standard libraries, guess why?).

statistics_and_file.write(x,y)

If x and y are strings, use x as a path to retrieve the file, where ".." can return to the previous level. Then, overwrite y with the retrieved file.


Coincidentally, there are exactly 7*2=14 functions in the statistics_and_file lib.

process

process.stdin.read(z)

reads at most z bytes from stdin, reads until EOF if z is omitted

process.stdout.write(z)

writes z to the stdout, unbuffered and with no trailing newline. If z is a list treat it as a list ob bytes

process.argv

returns the commald-line arguments as a list.

process.eval(x)

evaluates x as a septem lingua expression. (also see this to know how it this work)

process.exec(x)

edecutes x as a septem lingua code in current scope. (also see this to know how it this work)

process.getenv(x)

Gets the environment variable named x

process.setenv(x,y)

Sets the environment variable named x to y.

Coincidentally, ther are exactly 7 process library functions.

extr

extr.open(f,flags)
extr.read(handle,...args)
extr.write(handle,...args)

works as in python 3.12; extr.read(h,...s) is same as h.read(...s); same for extr.write

extr.fetch(uri,...args)

same as JavaScript's fetch

extr.llm(prompt)
extr.llm(prompt,llm)

feeds prompt into the LLM named llm and return the result. llm defaults to "Gemini 3.1 pro" but it is blocked by the great firewall of china, so in china you use qianwen instead, and using any LLMs from foreigners in china throws a ValueError because you can not access it. (this command isn't uncomputable)

extr.system(x)

execute x as a system command

extr.fork()

forks this whole program into a different thread.

coincidentally, there are exactly 7 functions in the extr library, and exactly 7 libraries in STL.

Examples

Hello, world!

print "Hello, world!"
halt

Better Machine

let x <- int(stdin)
let y <- int(stdin)
if (x - y) == 0 then do
    let a <- x + y
    while a != 0 do
        print 0
        a <- a - 1
    end
else
    while 1 do
        print 1
    end
end
halt

Turing completeness proof using brainfuck

[}setup{]
let tape <- list([0]*30000)
let ptr <- int(0)
@no_tab_on
@rule tape % 256

[}<{]
ptr <- ptr-1
[}>{]
ptr <- ptr+1
[}+{]
tape[ptr] <- tape[ptr]+1
[}-{]
tape[ptr] <- tape[ptr]-1
[},{]
try:
let a <- ascii_encode(rune(stdin))
tape[ptr] <- a
end
[}.{]
print ascii_decode(tape[ptr])
[}[{]
while tape[ptr] != 0 do
[}]{]
end

halt

Quine

let x <- "let y <- "let x <-"+repr(x)+"\\n"\nprint y+x\nhalt"
let y <- "let x <- "+repr(x)+"\n"
print y+x
halt

XKCD Random Number

let x <- random.int(4,4)
print x
halt

Truth-machine

@no_tab_on
let i <- int(stdin)
while i!=0 do print i end
print i
halt

OOP examples

[} we assume that a tab is 4 space (And that's indeed the case.){]
class stack do
    #stk: []
    constructor: lambda do
        this.#stk <- []
    end
    conversion(list): lambda do
        return this.#stk
    end
    push: lambda elt do
        this.stk <- concat(this.#stk,[elt])
    end
    pop: lambda do
        let x <- this.#stk[this.#stk.long-1] [} assume that the "let" is scoped {]
        this.#stk <- [this.#stk[i]|i in range(0,this.#stk.long-2)]
        return x
    end
    length: lambda do
        return this.#stk.long
    end
end
let s <- new stack()
s.push(21)
s.push(22)
s.push(91)
print s.pop()
print s.pop()
s.push(13)
print s.pop()
print s.pop()
try:
    print s.#stk
    halt
when NameError:
    print "you can't access a protected class variable" [}should be triggered{]
    halt

CT interpreter

class queue do
    #que: []
    constructor: lambda do
        this.#que <- []
    end
    conversion(list): lambda do
        return this.#que
    end
    push: lambda elt do
        this.stk <- concat(this.#que,[elt])
    end
    pop: lambda do
        let x <- this.#que[this.#que.long-1]
        this.#que <- [this.#que[i]|i in range(1,this.#que.long-1)]
        return x
    end
    length: lambda do
        return this.#que.long
    end
end
q=new queue()
q.push(1)
@import stdin.read from process
let program<-stdin.read()
let i<-0
let flag<-0
while q.length() do
    i <- 0
    while i<long program do
        if program[i]==";" then
            flag<-q.pop()
        end
        if flag then
            if program[i]=="0" then
                q.push(0)
            end
            if program[i]=="1" then
                q.push(0)
            end
        end
    end
end

More Coincidence

Coincidentally, the total number of coincidences this language specification contains exactly seven objects is exactly idk.

Perhaps there will only be more coincidences, making this coincidence less of a coincidence.

Note

Halt is easily forgotten, but it's essential; otherwise, it can create the illusion of a system crash.

<> indicates that the content is a parameter, not literal text.

[] indicates that the content is optional.

| indicates that multiple options are available.

Categories