mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
add json and file read
This commit is contained in:
25
ArLogo.svg
Normal file
25
ArLogo.svg
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="svg390198" viewBox="0 0 1024 768"
|
||||||
|
height="768px" width="1024px" version="1.1">
|
||||||
|
<g>
|
||||||
|
<g id="logo-center" transform="translate(0 0)">
|
||||||
|
<g
|
||||||
|
style="font-style:normal;font-weight:300;font-size:72px;line-height:1;font-family:'Montserrat Light Alt1';font-variant-ligatures:none;text-align:center;text-anchor:middle"
|
||||||
|
transform="translate(0 0)">
|
||||||
|
<path
|
||||||
|
style="font-style:normal;font-weight:300;font-size:72px;line-height:1;font-family:'Montserrat Light Alt1';font-variant-ligatures:none;text-align:center;text-anchor:middle"
|
||||||
|
d="m 499.63006,-50.4 h -3.672 L 472.77406,0 h 3.96 l 21.024,-46.368 21.096,46.368 h 3.96 z"
|
||||||
|
stroke-width="0" stroke-linejoin="miter" stroke-miterlimit="2" fill="#2596be" stroke="#2596be"
|
||||||
|
transform="translate(0 359.2) translate(398.2675550000001 -50.79999999999999) scale(3) translate(-472.77406 50.4)">
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
style="font-style:normal;font-weight:300;font-size:72px;line-height:1;font-family:'Montserrat Light Alt1';font-variant-ligatures:none;text-align:center;text-anchor:middle"
|
||||||
|
d="m 539.66769,-35.64 c -2.448,1.44 -4.248,3.528 -5.4,6.264 v -8.208 h -3.456 V 0 h 3.6 v -19.584 c 0,-4.608 1.152,-8.28 3.528,-10.872 2.304,-2.592 5.616,-3.96 9.792,-3.96 l 0.864,0.072 v -3.528 c -3.528,0 -6.48,0.792 -8.928,2.232 z"
|
||||||
|
stroke-width="0" stroke-linejoin="miter" stroke-miterlimit="2" fill="#6efbf7" stroke="#6efbf7"
|
||||||
|
transform="translate(0 359.2) translate(572.3804449999999 -13.216000000000001) scale(3) translate(-530.81169 37.872)">
|
||||||
|
</path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
@@ -1,3 +1,2 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
go build -o bin/argon.exe ./src
|
go build -o bin/argon.exe ./src
|
||||||
40
src/array.go
Normal file
40
src/array.go
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
var arrayCompile = makeRegex(`( *)\[(.|\n)*\]( *)`)
|
||||||
|
|
||||||
|
type CreateArray struct {
|
||||||
|
value ArArray
|
||||||
|
line int
|
||||||
|
code string
|
||||||
|
path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func isArray(code UNPARSEcode) bool {
|
||||||
|
return arrayCompile.MatchString(code.code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseArray(code UNPARSEcode, index int, codelines []UNPARSEcode) (any, bool, ArErr, int) {
|
||||||
|
trimmed := strings.TrimSpace(code.code)
|
||||||
|
trimmed = trimmed[1 : len(trimmed)-1]
|
||||||
|
arguments, worked, err := getValuesFromLetter(trimmed, ",", index, codelines, true)
|
||||||
|
return CreateArray{
|
||||||
|
value: arguments,
|
||||||
|
line: code.line,
|
||||||
|
code: code.realcode,
|
||||||
|
path: code.path,
|
||||||
|
}, worked, err, 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func runArray(a CreateArray, stack stack, stacklevel int) ([]any, ArErr) {
|
||||||
|
var array ArArray
|
||||||
|
for _, val := range a.value {
|
||||||
|
val, err := runVal(val, stack, stacklevel+1)
|
||||||
|
if err.EXISTS {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
array = append(array, val)
|
||||||
|
}
|
||||||
|
return array, ArErr{}
|
||||||
|
}
|
||||||
@@ -162,5 +162,7 @@ func init() {
|
|||||||
return nil, ArErr{TYPE: "TypeError", message: "Cannot append to '" + typeof(a[0]) + "'", EXISTS: true}
|
return nil, ArErr{TYPE: "TypeError", message: "Cannot append to '" + typeof(a[0]) + "'", EXISTS: true}
|
||||||
}}
|
}}
|
||||||
vars["sqrt"] = builtinFunc{"sqrt", ArgonSqrt}
|
vars["sqrt"] = builtinFunc{"sqrt", ArgonSqrt}
|
||||||
|
vars["file"] = ArFile
|
||||||
vars["random"] = ArRandom
|
vars["random"] = ArRandom
|
||||||
|
vars["json"] = ArJSON
|
||||||
}
|
}
|
||||||
|
|||||||
54
src/file.go
Normal file
54
src/file.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var ArFile = ArMap{
|
||||||
|
"read": builtinFunc{"read", ArRead},
|
||||||
|
}
|
||||||
|
|
||||||
|
func readtext(file *os.File) (string, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
_, err := io.Copy(&buf, file)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(buf.Bytes()), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ArRead(args ...any) (any, ArErr) {
|
||||||
|
if len(args) == 0 {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: "open takes 1 argument", EXISTS: true}
|
||||||
|
}
|
||||||
|
if typeof(args[0]) != "string" {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: "open takes a string not a '" + typeof(args[0]) + "'", EXISTS: true}
|
||||||
|
}
|
||||||
|
filename := args[0].(string)
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: err.Error(), EXISTS: true}
|
||||||
|
}
|
||||||
|
return ArMap{
|
||||||
|
"text": builtinFunc{"text", func(...any) (any, ArErr) {
|
||||||
|
text, err := readtext(file)
|
||||||
|
if err != nil {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: err.Error(), EXISTS: true}
|
||||||
|
}
|
||||||
|
return text, ArErr{}
|
||||||
|
}},
|
||||||
|
"json": builtinFunc{"json", func(...any) (any, ArErr) {
|
||||||
|
text, err := readtext(file)
|
||||||
|
if err != nil {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: err.Error(), EXISTS: true}
|
||||||
|
}
|
||||||
|
return parse(text), ArErr{}
|
||||||
|
}},
|
||||||
|
"line": builtinFunc{"line", func(...any) (any, ArErr) {
|
||||||
|
|
||||||
|
return "", ArErr{}
|
||||||
|
}},
|
||||||
|
}, ArErr{}
|
||||||
|
}
|
||||||
@@ -72,12 +72,13 @@ func mapGet(r ArMapGet, stack stack, stacklevel int) (any, ArErr) {
|
|||||||
if err.EXISTS {
|
if err.EXISTS {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if key == "length" {
|
switch key {
|
||||||
|
case "length":
|
||||||
return newNumber().SetInt64(int64(len(m))), ArErr{}
|
return newNumber().SetInt64(int64(len(m))), ArErr{}
|
||||||
}
|
}
|
||||||
return nil, ArErr{
|
return nil, ArErr{
|
||||||
"IndexError",
|
"IndexError",
|
||||||
"index not found",
|
"" + anyToArgon(key, true, true, 3, 0, false, 0) + " does not exist in array",
|
||||||
r.line,
|
r.line,
|
||||||
r.path,
|
r.path,
|
||||||
r.code,
|
r.code,
|
||||||
@@ -216,7 +217,8 @@ func mapGet(r ArMapGet, stack stack, stacklevel int) (any, ArErr) {
|
|||||||
if !slice {
|
if !slice {
|
||||||
return m[startindex], ArErr{}
|
return m[startindex], ArErr{}
|
||||||
}
|
}
|
||||||
return m[startindex:endindex:step], ArErr{}
|
fmt.Println(startindex, endindex, step)
|
||||||
|
return m[startindex:endindex], ArErr{}
|
||||||
case ArClass:
|
case ArClass:
|
||||||
if r.numberofindex > 1 {
|
if r.numberofindex > 1 {
|
||||||
return nil, ArErr{
|
return nil, ArErr{
|
||||||
99
src/jsonread.go
Normal file
99
src/jsonread.go
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func convertToArgon(obj any) any {
|
||||||
|
switch x := obj.(type) {
|
||||||
|
case map[string]interface{}:
|
||||||
|
newmap := ArMap{}
|
||||||
|
for key, value := range x {
|
||||||
|
newmap[key] = convertToArgon(value)
|
||||||
|
}
|
||||||
|
return newmap
|
||||||
|
case ArArray:
|
||||||
|
newarray := ArArray{}
|
||||||
|
for _, value := range x {
|
||||||
|
newarray = append(newarray, convertToArgon(value))
|
||||||
|
}
|
||||||
|
return newarray
|
||||||
|
case string:
|
||||||
|
return x
|
||||||
|
case float64:
|
||||||
|
return newNumber().SetFloat64(x)
|
||||||
|
case bool:
|
||||||
|
return x
|
||||||
|
case nil:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parse(str string) any {
|
||||||
|
var jsonMap any
|
||||||
|
json.Unmarshal([]byte(str), &jsonMap)
|
||||||
|
return convertToArgon(jsonMap)
|
||||||
|
}
|
||||||
|
|
||||||
|
func stringify(obj any) (string, error) {
|
||||||
|
output := []string{}
|
||||||
|
switch x := obj.(type) {
|
||||||
|
case ArMap:
|
||||||
|
for key, value := range x {
|
||||||
|
str, err := stringify(value)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
output = append(output, ""+strconv.Quote(anyToArgon(key, false, true, 3, 0, false, 0))+": "+str)
|
||||||
|
}
|
||||||
|
return "{" + strings.Join(output, ", ") + "}", nil
|
||||||
|
case ArArray:
|
||||||
|
output = append(output, "[")
|
||||||
|
for _, value := range x {
|
||||||
|
str, err := stringify(value)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
output = append(output, str)
|
||||||
|
}
|
||||||
|
output = append(output, "]")
|
||||||
|
return strings.Join(output, ", "), nil
|
||||||
|
case string:
|
||||||
|
return strconv.Quote(x), nil
|
||||||
|
case number:
|
||||||
|
num, _ := x.Float64()
|
||||||
|
return strconv.FormatFloat(num, 'f', -1, 64), nil
|
||||||
|
case bool:
|
||||||
|
return strconv.FormatBool(x), nil
|
||||||
|
case nil:
|
||||||
|
return "null", nil
|
||||||
|
}
|
||||||
|
err := errors.New("Cannot stringify " + typeof(obj))
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var ArJSON = ArMap{
|
||||||
|
"parse": builtinFunc{"parse", func(args ...any) (any, ArErr) {
|
||||||
|
if len(args) == 0 {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: "parse takes 1 argument", EXISTS: true}
|
||||||
|
}
|
||||||
|
if typeof(args[0]) != "string" {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: "parse takes a string not a '" + typeof(args[0]) + "'", EXISTS: true}
|
||||||
|
}
|
||||||
|
return parse(args[0].(string)), ArErr{}
|
||||||
|
}},
|
||||||
|
"stringify": builtinFunc{"stringify", func(args ...any) (any, ArErr) {
|
||||||
|
if len(args) == 0 {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: "stringify takes 1 argument", EXISTS: true}
|
||||||
|
}
|
||||||
|
str, err := stringify(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return ArMap{}, ArErr{TYPE: "Runtime Error", message: err.Error(), EXISTS: true}
|
||||||
|
}
|
||||||
|
return str, ArErr{}
|
||||||
|
}},
|
||||||
|
}
|
||||||
@@ -67,6 +67,8 @@ func runVal(line any, stack stack, stacklevel int) (any, ArErr) {
|
|||||||
return runIfStatement(x, stack, stacklevel+1)
|
return runIfStatement(x, stack, stacklevel+1)
|
||||||
case whileLoop:
|
case whileLoop:
|
||||||
return runWhileLoop(x, stack, stacklevel+1)
|
return runWhileLoop(x, stack, stacklevel+1)
|
||||||
|
case CreateArray:
|
||||||
|
return runArray(x, stack, stacklevel+1)
|
||||||
case bool:
|
case bool:
|
||||||
return x, ArErr{}
|
return x, ArErr{}
|
||||||
case nil:
|
case nil:
|
||||||
|
|||||||
@@ -87,6 +87,8 @@ func translateVal(code UNPARSEcode, index int, codelines []UNPARSEcode, isLine i
|
|||||||
return parseBoolean(code)
|
return parseBoolean(code)
|
||||||
} else if isVariable(code) {
|
} else if isVariable(code) {
|
||||||
return parseVariable(code)
|
return parseVariable(code)
|
||||||
|
} else if isArray(code) {
|
||||||
|
return parseArray(code, index, codelines)
|
||||||
} else if isMapGet(code) {
|
} else if isMapGet(code) {
|
||||||
return mapGetParse(code, index, codelines)
|
return mapGetParse(code, index, codelines)
|
||||||
} else if isIndexGet(code) {
|
} else if isIndexGet(code) {
|
||||||
|
|||||||
1
test.ar
1
test.ar
@@ -6,4 +6,3 @@ forever do
|
|||||||
i = i + 1
|
i = i + 1
|
||||||
if (i % 1000000 == 0) do
|
if (i % 1000000 == 0) do
|
||||||
term.log(i)
|
term.log(i)
|
||||||
break
|
|
||||||
Reference in New Issue
Block a user