Skip to main content

A customizable interpreted microlanguage designed to run untrusted code.

Project description

Scrolls

Scrolls is a small interpreter originally designed to allow users of my discord bots to make custom commands. It prioritizes control over the interpreter to help prevent abuse, while still allowing tight integration with python code.

Links

Why?

The two other candidates for user scripts were python and Lua. Python code is a nightmare to sandbox properly, and the available Lua interpreters for python didn't give me the kind of control I wanted over the interpreter. In addition, Lua was a bit much for simple custom commands. So, I made my own interpreter.

There is a scripting language available for Rust called Rhai with a similar concept.

Also, I just kinda wanted to try making an interpreted language...

Goals

  • Allow the developer to prevent abuse.
  • Integrate tightly with the parent python application.
  • Keep the syntax as simple as possible.

Getting Started

Check out the Links section above.

Installing

Scrolls may be installed through pip:

Linux

python3 -m pip install scrolls-py

Windows

py -3 -m pip install scrolls-py

Command Line Usage

The module comes with a built-in interpreter that may be invoked by executing the module. (Note that the linux version will be used from now on.)

python3 -m scrolls FILE

Try running some of the examples:

python3 -m scrolls ./examples/arithmetic.scrl

If no file is specified, the interpreter will run in interactive mode:

python3 -m scrolls

Example Code

Here are some sample programs showcasing the basic syntax of Scrolls. See the examples directory for more.

Fizzbuzz

!def(divisible? a b) {
    return $(eq? 0 $(% $a $b))
}

!for(n in $^(rangev 1 101)) {
    !if($(divisible? $n 15)) {
        print "FizzBuzz"
    } !elif($(divisible? $n 3)) {
        print "Fizz"
    } !elif($(divisible? $n 5)) {
        print "Buzz"
    } !else {
        print $n
    }
}

Nth Fibonacci Number

print "This will calculate fib N where fib 0 = 0, fib 1 = 1"
print "Enter N."
input n

set output_msg "Fibonacci number" $n "is"

!if($(< $n 2)) {
    print $^output_msg $n
    stop
}

set fib_prev 0
set fib 1
set i 2

!while($(<= $i $n)) {
    set tmp $fib_prev
    set fib_prev $fib
    set fib $(+ $tmp $fib)
    set i $(+ $i 1)
}

print $^output_msg $fib

Syntax Quirks

# In scrolls everything is a string
"print" "Everything is a string:"
!"for"("operator" "in" "+" "-" "*" "/") {
  "print" $($"operator" "5" "8")
}

String Escapes

print "\"test escapes\"\n\ttabbed\n\tlines\nunicode is supported: \u0398hello\u0398\n"

Programmatic Usage

Scrolls may be embedded into any python program:

import scrolls

# Create an interpreter. Note that an interpreter created this 
# way will not actually do anything. It's the responsibility of 
# the user to configure with the desired language features.
interpreter = scrolls.Interpreter()

# Configure the interpreter with the base language.
# scrolls.base_config is provided to make this common task
# a bit easier.
scrolls.base_config.configure(interpreter)

# Configure with stdio commands like input, and print
interpreter.command_handlers.add(scrolls.StdIoCommandHandler())

# Run your script.
script = """
print "Please enter your name:"
input name
!repeat(4) {
    print "Hello," $(cat $name "!")
}
"""
interpreter.run(script)

Acknowledgements

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scrolls-py-0.3.1.tar.gz (46.6 kB view details)

Uploaded Source

Built Distribution

scrolls_py-0.3.1-py3-none-any.whl (47.6 kB view details)

Uploaded Python 3

File details

Details for the file scrolls-py-0.3.1.tar.gz.

File metadata

  • Download URL: scrolls-py-0.3.1.tar.gz
  • Upload date:
  • Size: 46.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.1

File hashes

Hashes for scrolls-py-0.3.1.tar.gz
Algorithm Hash digest
SHA256 6f0cc8b39809d92103d60a95cc13a33de68d01250857a2d7cc7b2648cc929c13
MD5 0d00aa3772f3f4340d9dbc4db6514db5
BLAKE2b-256 001329cd6a089004ac57b29a6b567dbacb52b115f420b4d9f2f6922f42f53782

See more details on using hashes here.

File details

Details for the file scrolls_py-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: scrolls_py-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 47.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.1

File hashes

Hashes for scrolls_py-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 14ac6a4bf7ed0917417a62c4ea6b8c705cc50b31f88887798e4b3ff1f721abf6
MD5 4da3ec07fc4e8a8b2b7dbc64110c98d8
BLAKE2b-256 0653d37a4c9ed2a7e408747f4b6e21b405e58ad0e2bdf215c89b465214948966

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page