npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

false-language

v1.0.1

Published

Node.js FALSE interpreter

Downloads

4

Readme

Node.js False Interpreter

  • Run FALSE programs in Node.js

Install

npm install false-language

Examples

const fls = require ('false-language');

fls.runCode ('"Hello, is it me you\'re looking for?\n"');
fls.run ('sum.fls');
{sum.fls}
{USE read}
"a:
"r;!"b:
"r;!+."
"
{read.fls}
[0[^$$'01->\'9>~&]['0-\10*+]#%]r:

Language Description

FALSE is an esoteric programming language You can read more about it here.

FALSE uses stack as memory. Each operator takes parameters from a stack and pushes result to it.

  1. Elementary functions: "+" "-" "*" "/" "_" These function as usual. "_" is the unary minus. "=" ">" These result in 0 (false) or -1 (true) Unequal is "=~", and smaller than etc. can be made by swapping arguments And/or using "~"
Example:        a;1_=~          { a not equals -1 }

"&" "|" "~" "and", "or" and "not", as usual.

Example:        a;0>a;99>~&     { (a greater than 0) and (a less than 100) }
  1. Values: Values are either integers like discussed before ("1", "100" etc.), or characters precede by a quote: 'A (equals 65).
  2. Global variables: Variables to store values are less needed in FALSE than in other languages. In FALSE they are used mostly for functions, explained below. A variable is a character "a" to "z" (just these). ":" is the assignment function, and ";" is contrary: it gets the variable's value:
1a:     { a:=1 }
a;1+b:  { b:=a+1 }

I.e: "a;" is used where in other languages you would just write "a" 4. Functions: A FALSE lambda function is a piece of code between []. For example:

[1+]

is a function that adds 1 to it's argument. A function is really defined by what it takes from the stack (in this case the first arg to "+"), and what it puts back, just like builtin functions. Note that FALSE lambda functions are not restricted to just one return value.

What a [] expression really does, is push the function. this means in practise that it can be given to yet another function as argument etc., just like in functional languages. The symbol "!" is called "apply", and applies a function to it's arguments, for example:

2[1+]!

would result in "3". This wouldn't make much sense, since what you really want is define the function once, and then use it all-over. this is easy:

[1+]i:

this defines the function "i" (actually, it assigns the function to "i"), so that it can be used simply by applying "i" to it's arguments:

2i;! 5. Stack functions: "$" (x->x,x) duplicate topmost stackitem "%" (x->) delete topmost stack item "" (x1,x2->x2,x1) swap to topmost stack-items. "@" (x,x1,x2->x1,x2,x) rotate 3rd stack item to top. "O"or"o" (n->x) copy n-th item to top (0o equals $)

1$              equals          1 1
1 2%            equals          1
1 2\            equals          2 1
1 2 3@          equals          2 3 1
7 8 9 2o        equals          7 8 9 7
  1. Control structure: FALSE only has an IF and a WHILE. If is "?", and looks like this: (bool,fun-). Example:
a;1=["hello!"]?         { if a=1 then print "hello!" }

The first argument is a boolean value, the second the lambda function to be executed (see below for "") there's no "else", so you'll have to mimic this with a second "?". This can be easily done by copying the truthvalue:

a;1=$["true"]?~["false"]?

After the first "?" (wether it's executed or not), a copy of the truthvalue is still on the stack, and we negate it for the else part. Beware that if the first "if" needs arguments on the stack from before the boolean expression, it's top is still the truthvalue.

While is a "#", and gets two lambda functions as args, one that results in a boolean, and the second as body:

[a;1=][2f;!]#           { while a=1 do f(2) }

Note that with while, if and lambda's, you can build virtually any other control structure.

  1. Input/Output:
  • strings printing: strings simply print themselves
"Hello, World!"
  • integers: "." prints the topmost stack item as integer value:
123.            { prints string "123" on console }
  • characters: ","
65,             { prints "A" }
  • reading a character from stdin: "^"
^               { top stack is char read }
  • flush: "B" "B" flushes both input and output.
  1. Libraries: In this version of FALSE you can use libraries. Library is a code that you can execute by writing a special comment: {HELP} - prints help {USE READ} - implements r function that reads an integer from an input. It stops when a read char is not a number and "eats" first not-number symbol.
Example: {USE READ} 1_[r;!$0=~][]# %1 [\$1_=~][*]# %.

Prints a multiply of a non-zero numbers from input. {USE FACTORIAL} - implements f function that takes a number and returns it's factorial.

Example: {USE READ} {USE FACTORIAL} r;!f;!.

Prints a factorial of an input number. You can set and use your own libraries by executing {SET NAME CODE}.

Example: {SET FALSE "Best language"}

After that, every execution of {USE FALSE} will print "Best language". {USE NO LIMITS} - sets cycle execution limit for infinity (default is 5000 executions of cycle, then error). 9. All functions

syntax:         pops:           pushes:         example:

{comment}       -               -                       { this is a comment }
[code]          -               function        [1+]    { (lambda (x) (+ x 1)) }
a .. z          -               varadr          a       { use a: or a; }
integer         -               value           1
'char           -               value           'A      { 65 }
:               n,varadr        -               1a:     { a:=1 }
;               varadr          varvalue        a;      { a }
!               function        -               f;!     { f() }

+               n1,n1           n1+n2           1 2+    { 1+2 }
-               n1,n2           n1-n2           1 2-
*               n1,n2           n1*n2           1 2*
/               n1,n2           n1/n2           1 2/
_               n               -n              1_      { -1 }

=               n1,n1           n1=n2           1 2=~   { 1 not equeals 2 }
>               n1,n2           n1>n2           1 2>

&               n1,n2           n1 and n2       1 2&    { 1 and 2 }
|               n1,n2           n1 or n2        1 2|
~               n               not n           0~      { -1,TRUE }

$               n               n,n             1$      { dupl. top stack }
%               n               -               1%      { del. top stack }
\               n1,n2           n2,n1           1 2\    { swap }
@               n,n1,n2         n1,n2,n         1 2 3@  { rot }
o or O          n               v               1 2 1o  { pick }
?               bool,fun        -               a;2=[1f;!]? { if a=2 then f(1) }
#               boolf,fun       -               1[$100>~][1+]# { while 100 >= a do a:=a+1 }
.               n               -               1.      { printnum(1) }
"string"        -               -               "hi!"   { printstr("hi!") }
,               ch              -               10,     { putc(10) }
^               -               ch              ^       { getc() }
? or B  -               -               ?       { flush() }