arrowbit language
Project description
ArrowBit
ArrowBit is a customizable programming language engine that allows you to create your own domain-specific language (DSL) in Python. Define your commands once in Python, and ArrowBit handles all the parsing, execution, and runtime management for you.
✨ Features
- Custom Command Definition: Define commands using simple Python decorators
- Flexible Parameter Handling: Support for positional and named parameters
- Environment & Variables: Built-in variable system with strict mode support
- Cogs System: Organize commands into modular, reusable components
- Runtime Hooks: Handle errors, startup, and exit events with custom handlers
- REPL Support: Built-in Read-Eval-Print Loop for interactive development
- Context Flags: Pass contextual information to commands
- Object System: Type-safe object handling (STR, INT, BOOL, LIST, etc.)
📋 Prerequisites
- Python 3.10 or higher
🚀 Installation
Install ArrowBit via pip:
pip install arrowbit
📖 Quick Start
Your First Command
Create a simple "Hello, World!" command:
import arrowbit
from arrowbit import repl
@arrowbit.command(name='helloworld')
def my_first_command(env: arrowbit.Environment):
print("Hello, World!")
repl.execute('helloworld')
Output:
Hello, World!
Commands with Parameters
Commands can accept parameters:
import arrowbit
from arrowbit import repl
@arrowbit.command(name='greet')
def greet_command(env: arrowbit.Environment, name: str):
print(f"Hello, {name}!")
repl.execute('greet "Alice"') # Using named parameter
repl.execute('greet -name "Bob"') # Using flag parameter
Output:
Hello, Alice!
Hello, Bob!
Working with Variables
ArrowBit has a built-in variable system:
import arrowbit
from arrowbit import repl
@arrowbit.command(name='setvar')
def setvar(env: arrowbit.Environment, name: str, value: str):
env.assign(name, arrowbit.Object('STR', value))
print(f"Variable '{name}' set to: {value}")
@arrowbit.command(name='getvar')
def getvar(env: arrowbit.Environment, name: str):
if name in env.variables:
print(env.variables[name].value)
repl.execute('setvar "username" "Alice"')
repl.execute('getvar "username"')
🎯 Core Concepts
Environment
The Environment class manages variables and execution state:
env = arrowbit.Environment(strict=False)
# Assign variables
env.assign('myvar', arrowbit.Object('INT', 42))
# Access variables
value = env.variables['myvar'].value # 42
# Export values from commands
env.export(arrowbit.Object('STR', 'result'))
Runtime
The Runtime class manages command execution:
runtime = arrowbit.Runtime()
runtime.load("""
say "Starting program..."
greet "World"
say "Program complete!"
""")
runtime.start(env)
Object Types
ArrowBit supports various object types:
STR: String valuesINT: Integer valuesBOOL: Boolean valuesLIST: List/array valuesNULL: Null/None valuesVAR: Variable referencesCMD: Command invocationsCONDITION: Conditional expressions
Event Handlers
Handle runtime events with decorators:
@arrowbit.on_start()
def startup(env: arrowbit.Environment):
print("Program starting...")
@arrowbit.on_error()
def error_handler(env: arrowbit.Environment, err: arrowbit.errors.Error):
print(f"Error occurred: {err.message}")
@arrowbit.on_exit()
def cleanup(env: arrowbit.Environment):
print("Program exiting...")
🔧 Organizing with Cogs
For larger projects, use Cogs to organize commands:
import arrowbit
from arrowbit import cogs, Environment
class UtilitiesCog(cogs.Cog):
def __init__(self, env: Environment):
super().__init__(env)
def setup(self):
@self.command('add')
def add_cmd(env: Environment, a: int, b: int):
result = a + b
print(f"Result: {result}")
env.export(arrowbit.Object('INT', result))
@self.command('echo')
def echo_cmd(env: Environment, message: str):
print(message)
# Load the cog
env = arrowbit.Environment()
cogs.load_cog(UtilitiesCog(env), name='utils')
# Use commands
from arrowbit import repl
repl.execute('utils.add 5 3') # Result: 8
repl.execute('utils.echo "Hi!"') # Hi!
🎨 Context Flags
Commands can use context flags for conditional behavior:
@arrowbit.command(name='say')
def say(env: arrowbit.Environment, content: str):
is_bold = 'bold' in env.readonly['ctx'].value
if is_bold:
print(f"\033[1m{content}\033[0m")
else:
print(content)
# Usage with context flag
repl.execute('say -content "Normal text"')
repl.execute('say @bold -content "Bold text"')
📚 Documentation
- Introduction - Getting started guide
- Cogs Extension - Detailed Cogs documentation
🔍 Example Projects
Simple Calculator
import arrowbit
from arrowbit import cogs, Environment
class CalcCog(cogs.Cog):
def __init__(self, env: Environment):
super().__init__(env)
def setup(self):
@self.command('add')
def add(env: Environment, a: int, b: int):
print(a + b)
@self.command('subtract')
def subtract(env: Environment, a: int, b: int):
print(a - b)
@self.command('multiply')
def multiply(env: Environment, a: int, b: int):
print(a * b)
env = arrowbit.Environment()
cogs.load_cog(CalcCog(env), name='calc')
Interactive REPL
import arrowbit
from arrowbit import repl
@arrowbit.command(name='echo')
def echo(env: arrowbit.Environment, message: str):
print(message)
@arrowbit.on_start()
def startup(env: arrowbit.Environment):
print("Welcome to My REPL!")
repl.run() # Starts interactive REPL
🤝 Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
📄 License
This project is licensed under the terms specified in the LICENSE file.
🔗 Links
- Repository: ArrowBit on GitHub
- Issues: Report a bug
💡 Use Cases
ArrowBit is perfect for:
- Creating custom scripting languages for specific domains
- Building command-line tools with custom syntax
- Developing educational programming environments
- Prototyping domain-specific languages (DSLs)
- Creating interactive shells for applications
Made with ❤️ by Loan
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arrowbit-0.3.0.tar.gz.
File metadata
- Download URL: arrowbit-0.3.0.tar.gz
- Upload date:
- Size: 28.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b2d03c96a17cd96c13931b0cc63010e92d9a96aa235428d751bb6d742931969
|
|
| MD5 |
757324ba65de97fc1dc39a8a48a0259b
|
|
| BLAKE2b-256 |
bca31b35961ef6dd9da4f949f3773fa076676bba826cd893b563b1babb8863ff
|
File details
Details for the file arrowbit-0.3.0-py3-none-any.whl.
File metadata
- Download URL: arrowbit-0.3.0-py3-none-any.whl
- Upload date:
- Size: 28.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da48206021ffd062a7332e7e33c34d327af34b80e6a30ecb2b64e58c90f32a05
|
|
| MD5 |
0e8b6a2101bacae625d02a1c29e1ab96
|
|
| BLAKE2b-256 |
56e4baab49d27bc08066b8e8feac5e44cf749cfb3b24453e56d0f8c93bc7046c
|