Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

R-Pineapple/Red-Juice

Repository files navigation

Red Juice logo Red Juice v1.4.6

npm version Build Status Scc Count Badge Coverage Status Language grade: JavaScript Total alerts

Introduction

Red Juice is a home-made language with the purpose of procedurally generate mathematical problems.

You can output lines and equations while executing formal expressions and storing them in variables.

Since v1.4, it is now a Turing Complete language.

Installation

First, you need to build giac (see this page for more info) :

Warning : Giac needs a node version before 12

# build with max capacity (might be long anyway)
JOBS=4 npm install giac@latest

Then you can install with the following :

npm install red-juice --production

Usage

With node

then

const interpreter = require('red-juice');
...
const errors = interpreter.verify(code);
if(errors.length){
 //print/handle errors
} else {
 const output = interpreter.eval(code);
 // see example for output format
}

Commande line

node red-juice.js inputFile [-v][-h][-q][-d][-o outputFile][-j][-f][-s seed][-l]
-v / --verbose : more info
-h / --help : show this message
-q / --quiet : do not log output
-d / --debug : show debug log
-o / --output : indicate output file (activate json format)
-j / --json : json format
-f / --final : show as final exercise
-s / --seed : indicate numeric seed
-l / --latex : enable latex output of vars

Example

The code :

VAR A = 2;
VAR B = (A + 1)/2;
$\frac{{A}}{{B}}$ #LaTeX expression
START ex1;
 TIME 60;
 IF A < 5;
 ${A}\times {B}$
 this is a test
 START partA;
 this is partA
 END partA;
 ELSE;
 START partA;
 this is partA
 END partA;
 ENDIF;
END ex1;

Will output (

{
 "content" : {
 "" : "$\frac{2}{\frac{3}{2}}$\n",
 "#ex1" : "2ドル\times \frac{3}{2}$\nthis is a test\n",
 "#ex1#partA" : "this is partA\n"
 },
 "timers" : {
 "#ex1" : 60
 }
}

Writing rules

  • A line without a semicolon (;) is an output line.
  • Everything after an hashtag (#) is considered commented. (even outside code lines)
  • Indentation doesn't matter.
  • Variables in output surrounded by braces ({var}) will be replaced by its value in LaTeX.
  • Variables can be tested in output with {var:something}, it will be replaced with 'something' only if 'var' is not null.
  • Same thing, {!var:something}, it will be replaced with something only if 'var' is null.
  • Tests in output can be more complex like {var > 0 || var2 != 5:something}
  • In output you can use {simplify:something} and what's inside will be simplified and output in LaTeX
  • If the simplify output is red, it means it failed somehow (there is maybe some * missing between values)
  • Code line must start with a keyword (see below).
  • Expression will be computed and stored as formal. (1/3 will keep its formal value and be simplified if needed)
  • Keywords should be uppercase, but will work as any capitalization.
  • You can use predefined constants like PI.
  • Variable names must start with a letter.
  • Expression are written with basic mathematical symbols (-+*/^%) and functions. (see below)
  • Functions can be used with any capitalization.

Keywords

VAR - Assignation

Example :

VAR A = RAND(1, 10);
VAR A = e^SIN(A);

IF, ELIF, ELSE, ENDIF - Condition

Example :

IF A < 5;
 do something
ELIF A > 6 && A <= 10 || A >= 15;
 do something else
ELSE;
 do something else
ENDIF;

WHILE, ENDWHILE - Loops

Example :

WHILE A != B;
 do something
ENDWHILE;

START, END - Partition

Example :

will be outputed in part with blank name
START part1;
 will be outputed in part with name #part1
 START partA;
 will be outputed in part with name #part1#partA
 END partA;
 START partB;
 will be outputed in part with name #part1#partB
 END partB;
END part1;

TIME - Indication

Example :

START part1;
 TIME 60; #indicate for #part1
 START partA;
 TIME 65; #indicate for #part1#partA
 END partA;
 TIME 30; #overwrite for #part1
END part1;

Functions and operators list

Basic functions

Name Alias Arguments More info
rand 2 random value between argument 1 and argument 2 included
randnn 2 random value not null between argument 1 and argument 2 included
abs 1 absolute value or module of complex
sign 1 sign (-1,0,+1)
max 2 maximum
min 2 minimum
round 1
floor 1
frac 1
ceil 1
factorial 1
sqrt 1 square root
exp e^var 1 exponential
log ln 1 natural logarithm
log10 1 base 10 logarithm

Complexes

Name Alias Arguments More info
re 1 real part of complex
im 1 imaginary part of complex
arg 1 argument
conj 1 conjugate

Trigonometry

Name Alias Arguments More info
sin 1 sine
cos 1 cosine
tan 1 tangent
cot 1 cotangent
asin 1 arc sine
acos 1 arc cosine
atan 1 arc tangent
sinh 1 hyperbolic sine
cosh 1 hyperbolic cosine
tanh 1 hyperbolic tangent
asinh 1 argument of hyperbolic sine
acosh 1 argument of hyperbolic cosine
atanh 1 argument of hyperbolic tangent
asinh 1 argument of hyperbolic sine
acosh 1 argument of hyperbolic cosine
atanh 1 argument of hyperbolic tangent

Operators

Name Alias Arguments More info
neg -var 1 negative value
not !var 1 inverse value
plus var1 + var2 2 addition
minus var1 - var2 2 substraction
div var1 / var2 2 division
mod var1 % var2 2 modulo
pow var1 ^ var2 2 power
times var1 * var2 2 multiplication
eq var1 == var2 2 equal
neq var1 != var2 2 not equal
gte var1 >= var2 2 greater than or equal
lte var1 <= var2 2 less than or equal
gt var1 > var2 2 greater than
lt var1 < var2 2 less than
and var1 && var2 2
or `var1 var2`

Vectors and Matrices

Name Alias Arguments More info
length len 1 size of var
randvec 3 random vector of size arg 1 and values between arg 2 and arg 3
randmat 4 random matrix of size arg 1 x arg 2 and values between arg 3 and arg 4
get var1[var2] 2 get value of cell in var
cross 2 cross product between 2 vectors
vec{n} n creates a vector with n given values (ex: vec3(1,2,3))
tran ~mat1 1 transpose of matrix
mtimes mat1.*mat2 2 cell by cell multiplication
rank 1 rank of matrix
det 1 determinant of matrix
ker 1 kernel of matrix
image 1 image of matrix
idn 1 identity matrix of given size
zeros 2 create a matrix of size arg 1 x arg 2 filled with 0
ones 2 create a matrix of size arg 1 x arg 2 filled with 1

Constants

Name Alias Explanation
e exponential
pi PI π
infinity inf
i complex i
euler_gamma Euler constant γ
true True boolean value
false False boolean value

Changelog

  • 1.4.6: fixed auto install of giac.node
  • 1.4.5: added max node version + more info to install
  • 1.4.4: multiple subscriptions in formula (ex : [1][2])
  • 1.4.3: zeros and ones matrix functions
  • 1.4.2:
    • VAR A[B] = ...; var subscription by other var
    • no LaTeX in output by default in CLI (need --latex)
    • loop bug fix
  • 1.4.1: command line interface
  • 1.4.0: loops with WHILE, ENDWHILE
  • 1.3.5: Predefined capitalization for constants
  • 1.3.4: len function for vectors and matrices
  • 1.3.3: better looking vectors in LaTeX
  • 1.3.2: variable cell attribution VAR A[0] = 2;
  • 1.3.1 :
    • More constants : e, i, infinity, inf, euler_gamma, true, false
    • vec{n} creates vectors size n
    • subscriptable vars in expressions A[0] * A[1]
  • 1.3.0 :
    • Matrices and vectors functions
    • Safe giac call (avoid ERROR: something in output)
  • 1.2.9 : TIME keyword and output format change
  • 1.2.8 : RANDNN function
  • 1.2.7 : Remove blank outputed lines
  • 1.2.6 : Word blacklist for output
  • 1.2.5 : {simplify:2x+2x} -> 4\\cdot x
  • 1.2.4 : Version number to be shown in editor
  • 1.2.3 : Added error 'Restricted variable name'
  • 1.2.2 : Fix when output had a lot of -- or +-
  • 1.2.1 : +- and -- handling (not replacing already there)
  • 1.2 : A lot of functions ported from giac (see above)
  • 1.1.1 :
    • Fixed mis-implementation of Shunting Yard
    • Operators into functions (! -> not)
  • 1.1 :
    • LaTeX conditions {v:{v > 1:new version}{v == 0:same version}}
    • Bug fix
  • 1.0 :
    • Versioning
    • Not operators (!, !=`)
    • Negative things (-func, -var)
    • Debug switch
    • Bug fix

About

Official Red Juice language interpreter

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

Languages

AltStyle によって変換されたページ (->オリジナル) /