Virgo

From Esolang
Jump to: navigation, search

Virgo is a linear (line by line) programming language that uses just words and numbers, invented in 2010 and developed by Sinatra (aka User:Virgolang, I forgot the pass of Sinatra :( ). It is a retroactive product of the Zodiac Working Group.

Library

There are everything that you can use in Virgo.

Instructions

Instructions grouped here.

push

As in Assembly, it adds the value to stack.

push <value>

pop

As in Assembly, it pulls topmost item of stack and puts into operand.

pop <operand>

alloc

Declares a variable

alloc <name>

poparr

Same with pop, but it pops all the stack to operand as array. (clears the stack)

poparr <array operand>

pusharr

Same with push, but it pushes all the content of operand to stack. (fills the stack)

pusharr <array operand>

call

Calls functions (2nd tier instructions)

call <function name>

convst

Casts the topmost element of stack to specified type.

convst <type selector>

setif

Starts the if block.

setif

setelse

Ends the if block and starts the else block

setelse

endif

Ends an if-else recording and starts executing recordings based on passed condition.

endif

eso

It is special instruction that required to make use of esoteric functions of Virgo. Esoteric functions will only work with TaurusVM languages.

Functions (2nd tier instructions)

These functions can used only with call instruction.

add

Pops all stack to temporary array register and sums all of them. And pushes the sum to stack.

call add

cout

Outputs string in stack.

call cout

cin_line

Inputs line of string and pushes it to stack. (_0 pushed if nothing passed)

call cin_line

cerr

Outputs string in stack to stderr.

call cerr

Syntax

Syntax is pretty easy! Just write function name, and parameters. (all splitted by space)

Type selectors

Some instructions and functions may require type parameters. It's defined in this syntax:

<instruction> $<type name>$

If array:

<instruction> $<type name>+$

For functions you need to push type selector.

push $<type name>$

If array:

push $<type name>+$

And call it!

call <function name>

A sample:

convst $char+$

-or-

push $int$

Examples

This is just examples to get you into Virgo.

Hello world

push h
push e
push l
push l
push o
push _ch32
push w
push o
push r
push l
push d
alloc myStr
poparr myStr
push myStr
call cout.

Output

hello world

Explanation

It pushes all the characters one by one, creates a variable named myStr, pops all stack content to myStr as character array, pushes the myStr (for parameter for cout), and calls cout (the outputting function). The dot means program ended.

Adding two numbers together

alloc first
push 10
pop first
alloc second
push 3
pop second
push second
push first
call add
alloc sum
pop sum
alloc string_output
push sum
convst $char+$
poparr string_output
push string_output
call cout.

Output

13

Explanation

It allocates first, pushes 10 and pops to first (it literally sets first to 10) then, allocates second. Pushes 3 and pops to second (it literally sets second to 3). Now it pushes the parameters right-to-left since stacks are last-in-first-out, calls add (add pops all the elements on stack to temporary array and pushes the sum). Allocates sum, pops the return value to sum. Allocates string_output, pushes the sum; pops the last element, casts it to char array (+ means array of that type). Casting process pushes all the characters to stack. Pops all the stack as array to string_output, pushes string_output as array of char (not char by char). And calls cout.

Standard Input & Output

Without it, a language is not worth being a language.

alloc for_std_output
push W
push h
push a
push t
push _32
push i
push s
push _32
push y
push o
push u
push r
push _32
push n
push a
push m
push e
push _?_
push _32
poparr for_std_output
push for_std_output
call cout
alloc std_input
call cin_line
poparr std_input
alloc to_compare_str
push _0
poparr to_compare_str
push std_input
push to_compare_str
call equality
setif
push Y
push e
push s
alloc junk
poparr junk
push junk
call cout
setelse
push N
push o
alloc junk
poparr junk
push junk
call cout
endif

Output

If we enter nothing, it will push null (_0).

What is your name? 
Yes

If we enter something, it will push entry as string.

What is your name? fsafsaasdf
No

Explanation

We allocate a variable (for_std_output) for question. Pushed the question char by char. Popped them to variable. Pushed string concretely to stack. And asked the question. We allocated another variable (std_input) for getting the entry. Got the entry and popped to variable. We created another variable (to_compare) for comparing with null. Pushed 1 null. Popped it. And pushed the variable as 1st operand. And we pushed another variable (std_input) as 2nd operand. We called equality function (pops 2 element from stack and pushes the result). We created start point for 'if' with setif (it stops executing as it records to temporary code stack). It records the statements until setelse or endif. When it gets to setelse, it starts to recording else block (doesn't wipe if recording) until the endif instruction. When it gets endif, it executes correct block.

How can use this language?

Since there's no interpreter for Virgo, you can only write programs now. Interpreter will convert into C++, compile with G++. If not possible, it'll run it line by line like script. And it will compile to the TaurusVM.

What is the current process?

We're implementing streams.

What will you do?

Implement Maths...