You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Arsen Musayelyan bb89c93344 Add opposite values and README.md 11 months ago
cmd/scpt Implement return, implement instant break, add exit function, implement dumping and loading of AST via encoding/json 11 months ago
.gitignore Implement functions, arrays, maps, and while loops. Document and clean up code. 11 months ago
LICENSE Add LICENSE 11 months ago
README.md Add opposite values and README.md 11 months ago
ast.go Add opposite values and README.md 11 months ago
defaults.go Move default maps/variables to default.go and add print default function 11 months ago
go.mod Clean up code and add support for multiple operations in expression 11 months ago
go.sum Implement return, implement instant break, add exit function, implement dumping and loading of AST via encoding/json 11 months ago
lexer.go Add opposite values and README.md 11 months ago
scpt.go Add opposite values and README.md 11 months ago
test.scpt Implement return, implement instant break, add exit function, implement dumping and loading of AST via encoding/json 11 months ago

README.md

scpt

scpt is an applescript-inspired scripting language written for fun and to see if I could.

Go Reference


Usage

scpt is to be used as a library imported into Go. A basic interpreter with no extra functionality would look like this:

package main

import (
	"gitea.arsenm.dev/Arsen6331/scpt"
	"log"
	"os"
	"path/filepath"
)

func main() {
	filename := os.Args[1]
	file, err := os.Open(filepath.Clean(filename))
	if err != nil {
		log.Fatalln(err)
	}
	ast, err := scpt.Parse(file)
	if err != nil {
		log.Fatalln(err)
	}
	err = ast.Execute()
	if err != nil {
		log.Fatalln(err)
	}
}

Basic Syntax

The basic syntax of scpt can be learned from the test.scpt file.


Default Functions

scpt comes with the following default functions:

  • str: Convert value to string
  • num: Parse string to number (float64)
  • bool: Parse string to boolean
  • break: Break out of loop (Errors if not in loop)
  • append: Return an array with given items appended
  • exit: Exit with given exit code
  • return: Return value in function (Errors if not within function)
  • print: Print using fmt.Println()

Adding functionality:

Adding functionality is simple and requires a call to scpt.AddFuncs() or scpt.AddVars(). Here are some examples:

scpt.AddFuncs(scpt.FuncMap{
	"my-function": myFunction
})

Where myFunction is:

func myFunction(args map[string]interface{}) (interface{}, error) {
	fmt.Println(args)
	return nil, nil
}

After the call to scpt.AddFuncs(), my-function can be used to run the function from within an scpt script. Variables work similarly.