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 8aa6f45db2 Add defer file.Close() to the README interpreter example 9 months ago
cmd/scpt Remove unnecessary copyright headers 9 months ago
.gitignore Implement functions, arrays, maps, and while loops. Document and clean up code. 9 months ago
LICENSE Add LICENSE 9 months ago
README.md Add defer file.Close() to the README interpreter example 9 months ago
ast.go Remove unnecessary copyright headers 9 months ago
defaults.go Remove unnecessary copyright headers 9 months ago
go.mod Clean up code and add support for multiple operations in expression 9 months ago
go.sum Implement return, implement instant break, add exit function, implement dumping and loading of AST via encoding/json 9 months ago
lexer.go Remove unnecessary copyright headers 9 months ago
scpt.go Remove unnecessary copyright headers 9 months ago
test.scpt Implement return, implement instant break, add exit function, implement dumping and loading of AST via encoding/json 9 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)
	}
	defer file.Close()
	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.