mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
Compare commits
9 Commits
oop_number
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 4791aefd76 | |||
| 8f51b24c7c | |||
| c75be1c8ed | |||
| 885a5b0387 | |||
| 60cbda6d9d | |||
| 5eb2a0e789 | |||
| 55db84fcce | |||
| 4910a2337b | |||
|
|
f98cf47988 |
@@ -1,2 +1,2 @@
|
||||
@echo off
|
||||
go build -trimpath -ldflags="-s -w" -o bin/argon.exe ./src
|
||||
go build -trimpath -ldflags="-s -w" -tags WINDOWS -o bin/argon.exe ./src
|
||||
@@ -3,4 +3,4 @@
|
||||
:: run the go run command passing the path to the main.go file, with the working directory set to the bin folder. pass in the arguments
|
||||
|
||||
set __ARGON_DEBUG__=true
|
||||
go run ./src %*
|
||||
go run -tags WINDOWS ./src %*
|
||||
12
go.mod
12
go.mod
@@ -7,7 +7,15 @@ require (
|
||||
github.com/wadey/go-rounding v1.1.0
|
||||
)
|
||||
|
||||
require github.com/joho/godotenv v1.5.1 // indirect
|
||||
require (
|
||||
github.com/chzyer/readline v1.5.1 // indirect
|
||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||
github.com/joho/godotenv v1.5.1 // indirect
|
||||
github.com/shirou/gopsutil v2.21.11+incompatible // indirect
|
||||
github.com/tklauser/go-sysconf v0.3.14 // indirect
|
||||
github.com/tklauser/numcpus v0.8.0 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/gabriel-vasile/mimetype v1.4.2
|
||||
@@ -18,7 +26,7 @@ require (
|
||||
github.com/jwalton/go-supportscolor v1.1.0
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
||||
golang.org/x/sys v0.6.0 // indirect
|
||||
golang.org/x/sys v0.19.0 // indirect
|
||||
golang.org/x/term v0.6.0
|
||||
golang.org/x/text v0.8.0
|
||||
)
|
||||
|
||||
18
go.sum
18
go.sum
@@ -1,7 +1,13 @@
|
||||
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
|
||||
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
|
||||
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
|
||||
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
|
||||
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
|
||||
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
|
||||
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
|
||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/jwalton/go-supportscolor v1.1.0 h1:HsXFJdMPjRUAx8cIW6g30hVSFYaxh9yRQwEWgkAR7lQ=
|
||||
@@ -11,19 +17,31 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
|
||||
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/shirou/gopsutil v2.21.11+incompatible h1:lOGOyCG67a5dv2hq5Z1BLDUqqKp3HkbjPcz5j6XMS0U=
|
||||
github.com/shirou/gopsutil v2.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
||||
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
||||
github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
|
||||
github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
|
||||
github.com/wadey/go-rounding v1.1.0 h1:RAs9dMkB/uUHFv9ljlbRFC8/kBrQ5jhwt1GQq+2cciY=
|
||||
github.com/wadey/go-rounding v1.1.0/go.mod h1:/uD953tCL6Fea2Yp+LZBBp8d60QSObkMJxY6SPOJ5QE=
|
||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
|
||||
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
|
||||
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
|
||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw=
|
||||
|
||||
@@ -17,7 +17,12 @@ ARGON 3 is a math-driven programming language designed to make code easy to read
|
||||
- Cross-platform: Argon 3 can be run on any platform that has an interpreter for it.
|
||||
|
||||
## 💻 Installation
|
||||
As of now, Argon 3 does not have an installer. Feel free to clone this repo and run the `build` file for your plateform. the build will be found in `bin/argon(.exe)`.
|
||||
### Windows
|
||||
As of now, Argon 3 does not have a windows installer. Feel free to clone this repo and run the `build.bat` file. the build will be found in `bin\argon.exe`.
|
||||
If you want to also use the isotope package manager, you can find the source code [here](https://github.com/open-argon/isotope).
|
||||
|
||||
### UNIX based (macOS and Linux)
|
||||
Unix based operating systems can use the argon installer script found at [https://argon.wbell.dev/](https://argon.wbell.dev/). The script should run on all modern linux distros, and should also work on macOS with limited support. It may also work on other Unix based operating systems such at FreeBSD, but those are untested but are supported if you have issues.
|
||||
|
||||
## 📖 Usage
|
||||
To use Argon 3, you can create a file with the .ar extension and write your code in it. Then, you can run your code using the interpreter. For example, if you have a file called example.ar, you can run it using the following command:
|
||||
|
||||
9
server_test/app.ar
Normal file
9
server_test/app.ar
Normal file
@@ -0,0 +1,9 @@
|
||||
import "http.ar" as http
|
||||
|
||||
let server = http.server()
|
||||
|
||||
let home(req,res) = do
|
||||
res.send("hello world")
|
||||
server.get("/", home)
|
||||
|
||||
server.run()
|
||||
25
src/array.go
25
src/array.go
@@ -61,6 +61,29 @@ func ArArray(arr []any) ArObject {
|
||||
return nil, ArErr{}
|
||||
},
|
||||
}
|
||||
val.obj["__Multiply__"] = builtinFunc{
|
||||
"__Multiply__",
|
||||
func(a ...any) (any, ArErr) {
|
||||
if len(a) != 1 {
|
||||
return nil, ArErr{"Type Error", "expected 1 argument, got " + fmt.Sprint(len(a)), 0, "", "", true}
|
||||
}
|
||||
if typeof(a[0]) != "number" {
|
||||
return nil, ArErr{"Type Error", "cannot multiply array by " + typeof(a[0]), 0, "", "", true}
|
||||
}
|
||||
n := a[0].(number)
|
||||
if !n.IsInt() {
|
||||
return nil, ArErr{"Value Error", "cannot multiply array by float", 0, "", "", true}
|
||||
}
|
||||
if n.Sign() < 0 {
|
||||
return nil, ArErr{"Value Error", "cannot multiply array by negative number", 0, "", "", true}
|
||||
}
|
||||
size := int(n.Num().Int64())
|
||||
retval := make([]any, 0, len(arr)*size)
|
||||
for i := 0; i < size; i++ {
|
||||
retval = append(retval, arr...)
|
||||
}
|
||||
return ArArray(retval), ArErr{}
|
||||
}}
|
||||
val.obj["__getindex__"] = builtinFunc{
|
||||
"__getindex__",
|
||||
func(a ...any) (any, ArErr) {
|
||||
@@ -474,7 +497,7 @@ func ArArray(arr []any) ArObject {
|
||||
}
|
||||
if len(arr) == 0 {
|
||||
return nil, ArErr{
|
||||
TYPE: "ValueError",
|
||||
TYPE: "Value Error",
|
||||
message: "array is empty",
|
||||
EXISTS: true,
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ func ArByte(Byte byte) ArObject {
|
||||
n := x.Num().Int64()
|
||||
if n > 255 || n < 0 {
|
||||
return nil, ArErr{
|
||||
TYPE: "ValueError",
|
||||
TYPE: "Value Error",
|
||||
message: "expected number between 0 and 255, got " + fmt.Sprint(floor(x).Num().Int64()),
|
||||
EXISTS: true,
|
||||
}
|
||||
@@ -62,7 +62,7 @@ func ArByte(Byte byte) ArObject {
|
||||
case string:
|
||||
if len(x) != 1 {
|
||||
return nil, ArErr{
|
||||
TYPE: "ValueError",
|
||||
TYPE: "Value Error",
|
||||
message: "expected string of length 1, got " + fmt.Sprint(len(x)),
|
||||
EXISTS: true,
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ func makeGlobal() ArObject {
|
||||
var vars = anymap{}
|
||||
vars["global"] = vars
|
||||
vars["env"] = env
|
||||
vars["platform"] = platform
|
||||
vars["term"] = ArTerm
|
||||
vars["ArgonVersion"] = ArString(VERSION)
|
||||
vars["ArgonVersionNumber"] = newNumber().SetInt64(VERSION_NUM)
|
||||
@@ -266,7 +267,7 @@ func makeGlobal() ArObject {
|
||||
switch x := a[0].(type) {
|
||||
case string:
|
||||
if len(x) != 1 {
|
||||
return nil, ArErr{TYPE: "ord", message: "ord takes a string with only one character, got " + fmt.Sprint(len(a)), EXISTS: true}
|
||||
return nil, ArErr{TYPE: "ord", message: "ord takes a string with only one character, got " + fmt.Sprint(len(x)), EXISTS: true}
|
||||
}
|
||||
return floor(newNumber().SetInt64(int64([]rune(x)[0]))), ArErr{}
|
||||
}
|
||||
|
||||
@@ -156,6 +156,7 @@ func translateImport(realpath string, origin string, topLevelOnly bool) (transla
|
||||
|
||||
importing[p] = true
|
||||
translated, translationerr := translate(codelines)
|
||||
debugPrintln(translated...)
|
||||
importing[p] = false
|
||||
|
||||
if translationerr.EXISTS {
|
||||
|
||||
52
src/input.go
52
src/input.go
@@ -1,63 +1,13 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
func input(args ...any) string {
|
||||
output := []any{}
|
||||
for i := 0; i < len(args); i++ {
|
||||
output = append(output, anyToArgon(args[i], false, true, 3, 0, true, 0))
|
||||
}
|
||||
fmt.Print(output...)
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
scanner.Scan()
|
||||
input := scanner.Text()
|
||||
return input
|
||||
}
|
||||
|
||||
func getPassword(args ...any) (string, error) {
|
||||
output := []any{}
|
||||
for i := 0; i < len(args); i++ {
|
||||
output = append(output, anyToArgon(args[i], false, true, 3, 0, true, 0))
|
||||
}
|
||||
fmt.Print(output...)
|
||||
password := []byte{}
|
||||
|
||||
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer term.Restore(int(os.Stdin.Fd()), oldState)
|
||||
|
||||
for {
|
||||
char := make([]byte, 1)
|
||||
_, err := os.Stdin.Read(char)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if char[0] == 3 || char[0] == 4 {
|
||||
return "", fmt.Errorf("keyboard interupt")
|
||||
} else if char[0] == '\r' || char[0] == '\n' {
|
||||
fmt.Println()
|
||||
break
|
||||
} else if char[0] == '\b' || char[0] == 127 {
|
||||
if len(password) > 0 {
|
||||
password = password[:len(password)-1]
|
||||
fmt.Print("\b \b")
|
||||
}
|
||||
} else {
|
||||
password = append(password, char[0])
|
||||
fmt.Print("*")
|
||||
}
|
||||
}
|
||||
fmt.Print("\r")
|
||||
return string(password), nil
|
||||
}
|
||||
var tempFilePath = os.TempDir() + "/argon_input_history.tmp"
|
||||
|
||||
func pause() {
|
||||
fmt.Print("Press Enter to continue...")
|
||||
|
||||
55
src/input_unix.go
Normal file
55
src/input_unix.go
Normal file
@@ -0,0 +1,55 @@
|
||||
//go:build !WINDOWS
|
||||
// +build !WINDOWS
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/chzyer/readline"
|
||||
)
|
||||
|
||||
func input(args ...any) (string, error) {
|
||||
output := []any{}
|
||||
for i := 0; i < len(args); i++ {
|
||||
output = append(output, anyToArgon(args[i], false, true, 3, 0, true, 0))
|
||||
}
|
||||
message := fmt.Sprint(output...)
|
||||
rl, err := readline.NewEx(&readline.Config{
|
||||
Prompt: message,
|
||||
HistoryFile: tempFilePath,
|
||||
HistorySearchFold: true,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to create readline instance: %v", err)
|
||||
}
|
||||
defer rl.Close()
|
||||
line, err := rl.Readline()
|
||||
if err != nil { // io.EOF or other error
|
||||
return "", err
|
||||
}
|
||||
return line, nil
|
||||
}
|
||||
|
||||
func getPassword(args ...any) (string, error) {
|
||||
output := []any{}
|
||||
for i := 0; i < len(args); i++ {
|
||||
output = append(output, anyToArgon(args[i], false, true, 3, 0, true, 0))
|
||||
}
|
||||
message := fmt.Sprint(output...)
|
||||
rl, err := readline.NewEx(&readline.Config{
|
||||
Prompt: message,
|
||||
MaskRune: '*',
|
||||
EnableMask: true,
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to create readline instance: %v", err)
|
||||
}
|
||||
defer rl.Close()
|
||||
line, err := rl.Readline()
|
||||
if err != nil { // io.EOF or other error
|
||||
return "", err
|
||||
}
|
||||
return line, nil
|
||||
}
|
||||
63
src/input_windows.go
Normal file
63
src/input_windows.go
Normal file
@@ -0,0 +1,63 @@
|
||||
//go:build WINDOWS
|
||||
// +build WINDOWS
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
func input(args ...any) (string, error) {
|
||||
output := []any{}
|
||||
for i := 0; i < len(args); i++ {
|
||||
output = append(output, anyToArgon(args[i], false, true, 3, 0, true, 0))
|
||||
}
|
||||
fmt.Print(output...)
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
scanner.Scan()
|
||||
input := scanner.Text()
|
||||
return input, nil
|
||||
}
|
||||
|
||||
func getPassword(args ...any) (string, error) {
|
||||
output := []any{}
|
||||
for i := 0; i < len(args); i++ {
|
||||
output = append(output, anyToArgon(args[i], false, true, 3, 0, true, 0))
|
||||
}
|
||||
fmt.Print(output...)
|
||||
password := []byte{}
|
||||
|
||||
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer term.Restore(int(os.Stdin.Fd()), oldState)
|
||||
|
||||
for {
|
||||
char := make([]byte, 1)
|
||||
_, err := os.Stdin.Read(char)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if char[0] == 3 || char[0] == 4 {
|
||||
return "", fmt.Errorf("keyboard interupt")
|
||||
} else if char[0] == '\r' || char[0] == '\n' {
|
||||
fmt.Println()
|
||||
break
|
||||
} else if char[0] == '\b' || char[0] == 127 {
|
||||
if len(password) > 0 {
|
||||
password = password[:len(password)-1]
|
||||
fmt.Print("\b \b")
|
||||
}
|
||||
} else {
|
||||
password = append(password, char[0])
|
||||
fmt.Print("*")
|
||||
}
|
||||
}
|
||||
fmt.Print("\r")
|
||||
return string(password), nil
|
||||
}
|
||||
@@ -10,8 +10,8 @@ var Args = os.Args[1:]
|
||||
|
||||
type stack = []ArObject
|
||||
|
||||
const VERSION = "3.0.8"
|
||||
const VERSION_NUM = 6
|
||||
const VERSION = "3.0.11"
|
||||
const VERSION_NUM = 9
|
||||
|
||||
func newscope() ArObject {
|
||||
return Map(anymap{})
|
||||
|
||||
@@ -20,8 +20,8 @@ var operations = []string{
|
||||
"==",
|
||||
"+",
|
||||
"-",
|
||||
"*",
|
||||
"%",
|
||||
"*",
|
||||
"//",
|
||||
"/",
|
||||
"^",
|
||||
@@ -918,9 +918,9 @@ func runOperation(o operationType, stack stack, stacklevel int) (any, ArErr) {
|
||||
case 11:
|
||||
return calcNegative(o, stack, stacklevel+1)
|
||||
case 12:
|
||||
return calcMul(o, stack, stacklevel+1)
|
||||
case 13:
|
||||
return calcMod(o, stack, stacklevel+1)
|
||||
case 13:
|
||||
return calcMul(o, stack, stacklevel+1)
|
||||
case 14:
|
||||
return calcIntDiv(o, stack, stacklevel+1)
|
||||
case 15:
|
||||
|
||||
49
src/platform.go
Normal file
49
src/platform.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"time"
|
||||
|
||||
"github.com/shirou/gopsutil/cpu"
|
||||
)
|
||||
|
||||
var platform = Map(
|
||||
anymap{
|
||||
"os": ArString(runtime.GOOS),
|
||||
|
||||
"cpu": Map(anymap{
|
||||
"count": newNumber().SetInt64((int64)(runtime.NumCPU())),
|
||||
"usage": builtinFunc{"usage", func(args ...any) (any, ArErr) {
|
||||
if len(args) != 2 {
|
||||
return nil, ArErr{
|
||||
TYPE: "Runtime Error",
|
||||
message: "usage takes 2 arguments, got " + fmt.Sprint(len(args)),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
if !isAnyNumber(args[0]) {
|
||||
return nil, ArErr{
|
||||
TYPE: "Runtime Error",
|
||||
message: "first argument is meant to be a number, got " + fmt.Sprint(typeof(args[0])),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
var Number = newNumber().Mul(args[0].(number), newNumber().SetInt64(1000)).Num().Int64()
|
||||
avgPercent, err := cpu.Percent(time.Duration(Number)*time.Millisecond, anyToBool(args[1]))
|
||||
if err != nil {
|
||||
return nil, ArErr{
|
||||
TYPE: "Runtime Error",
|
||||
message: err.Error(),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
var ArAvgPercent = []any{}
|
||||
for i := 0; i < len(avgPercent); i++ {
|
||||
ArAvgPercent = append(ArAvgPercent, newNumber().SetFloat64(avgPercent[i]))
|
||||
}
|
||||
return ArArray(ArAvgPercent), ArErr{}
|
||||
}},
|
||||
}),
|
||||
},
|
||||
)
|
||||
11
src/shell.go
11
src/shell.go
@@ -14,12 +14,12 @@ func shell(global ArObject) {
|
||||
go func() {
|
||||
for sig := range c {
|
||||
if sig == os.Interrupt {
|
||||
fmt.Println("\x1b[0m\n\x1b[32;5;240mBye :)\x1b[0m")
|
||||
fmt.Println("\x1b[0m\n\x1b[32;240mBye :)\x1b[0m")
|
||||
os.Exit(0)
|
||||
}
|
||||
}
|
||||
}()
|
||||
fmt.Print("\x1b[32;5;240mWelcome to the Argon v3!\x1b[0m\n\n")
|
||||
fmt.Print("\x1b[32;240mWelcome to the Argon v3!\x1b[0m\n\n")
|
||||
for {
|
||||
indent := 0
|
||||
previous := 0
|
||||
@@ -27,7 +27,12 @@ func shell(global ArObject) {
|
||||
textBefore := ">>>"
|
||||
for i := 1; indent > 0 || (previous != indent && indent >= 0) || i == 1; i++ {
|
||||
indentStr := strings.Repeat(" ", indent)
|
||||
code := indentStr + input("\x1b[38;5;240m"+textBefore+indentStr+" \x1b[0m\x1b[1;5;240m")
|
||||
inp, err := input("\x1b[38;240m" + textBefore + indentStr + " \x1b[0m")
|
||||
if err != nil {
|
||||
fmt.Println("\x1b[0m\n\x1b[32;240mBye :)\x1b[0m")
|
||||
os.Exit(0)
|
||||
}
|
||||
code := indentStr + inp
|
||||
fmt.Print("\x1b[0m")
|
||||
totranslate = append(totranslate, UNPARSEcode{code, code, i, "<shell>"})
|
||||
trimmed := strings.TrimSpace(code)
|
||||
|
||||
@@ -629,10 +629,10 @@ func ArString(str string) ArObject {
|
||||
}
|
||||
n := a[0].(number)
|
||||
if !n.IsInt() {
|
||||
return nil, ArErr{"ValueError", "cannot multiply string by float", 0, "", "", true}
|
||||
return nil, ArErr{"Value Error", "cannot multiply string by float", 0, "", "", true}
|
||||
}
|
||||
if n.Sign() < 0 {
|
||||
return nil, ArErr{"ValueError", "cannot multiply string by negative number", 0, "", "", true}
|
||||
return nil, ArErr{"Value Error", "cannot multiply string by negative number", 0, "", "", true}
|
||||
}
|
||||
return strings.Repeat(str, int(n.Num().Int64())), ArErr{}
|
||||
}}
|
||||
|
||||
@@ -140,7 +140,15 @@ var ArInput = Map(
|
||||
return ArString(resp), ArErr{}
|
||||
}},
|
||||
"__call__": builtinFunc{"input", func(args ...any) (any, ArErr) {
|
||||
return input(args...), ArErr{}
|
||||
inp, err := input(args...)
|
||||
if err != nil {
|
||||
return nil, ArErr{
|
||||
TYPE: "Runtime Error",
|
||||
message: err.Error(),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
return ArString(inp), ArErr{}
|
||||
}},
|
||||
"pause": builtinFunc{"pause", func(args ...any) (any, ArErr) {
|
||||
pause()
|
||||
|
||||
@@ -42,7 +42,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
}
|
||||
case number:
|
||||
if colored {
|
||||
output = append(output, "\x1b[34;5;240m")
|
||||
output = append(output, "\x1b[34;240m")
|
||||
}
|
||||
num, _ := x.Float64()
|
||||
if math.IsNaN(num) {
|
||||
@@ -59,7 +59,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
}
|
||||
case bool:
|
||||
if colored {
|
||||
output = append(output, "\x1b[35;5;240m")
|
||||
output = append(output, "\x1b[35;240m")
|
||||
}
|
||||
output = append(output, strconv.FormatBool(x))
|
||||
if colored {
|
||||
@@ -67,7 +67,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
}
|
||||
case nil:
|
||||
if colored {
|
||||
output = append(output, "\x1b[31;5;240m")
|
||||
output = append(output, "\x1b[31;240m")
|
||||
}
|
||||
output = append(output, "null")
|
||||
if colored {
|
||||
@@ -128,7 +128,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
} else {
|
||||
outputkeyval := []string{}
|
||||
if colored {
|
||||
outputkeyval = append(outputkeyval, "\x1b[36;5;240m")
|
||||
outputkeyval = append(outputkeyval, "\x1b[36;240m")
|
||||
}
|
||||
outputkeyval = append(outputkeyval, key.(string))
|
||||
if colored {
|
||||
@@ -148,7 +148,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
output = append(output, anyToArgon(item, true, true, depth-1, indent+1, colored, plain))
|
||||
}
|
||||
if colored {
|
||||
output = append(output, "\x1b[38;5;240m(...)\x1b[0m")
|
||||
output = append(output, "\x1b[38;240m(...)\x1b[0m")
|
||||
} else {
|
||||
output = append(output, "(...)")
|
||||
}
|
||||
@@ -173,7 +173,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
return "[" + maybenewline + (strings.Repeat(" ", (indent+1)*plain)) + strings.Join(output, ","+maybenewline+(strings.Repeat(" ", (indent+1)*plain))) + maybenewline + (strings.Repeat(" ", indent*plain)) + "]"
|
||||
case builtinFunc:
|
||||
if colored {
|
||||
output = append(output, "\x1b[38;5;240m")
|
||||
output = append(output, "\x1b[38;240m")
|
||||
}
|
||||
output = append(output, "<builtin function "+x.name+">")
|
||||
if colored {
|
||||
@@ -181,7 +181,7 @@ func anyToArgon(x any, quote bool, simplify bool, depth int, indent int, colored
|
||||
}
|
||||
case Callable:
|
||||
if colored {
|
||||
output = append(output, "\x1b[38;5;240m")
|
||||
output = append(output, "\x1b[38;240m")
|
||||
}
|
||||
output = append(output, "<function "+x.name+">")
|
||||
if colored {
|
||||
|
||||
@@ -139,6 +139,9 @@ func translateVal(code UNPARSEcode, index int, codelines []UNPARSEcode, isLine i
|
||||
return nil, worked, err, step
|
||||
}
|
||||
}
|
||||
if isNegative(code) {
|
||||
return parseNegative(code, index, codelines)
|
||||
}
|
||||
if !QuickKnownFailures["call"+code.code] && isCall(code) {
|
||||
resp, worked, err, i = parseCall(code, index, codelines)
|
||||
if worked {
|
||||
@@ -146,9 +149,7 @@ func translateVal(code UNPARSEcode, index int, codelines []UNPARSEcode, isLine i
|
||||
}
|
||||
QuickKnownFailures["call"+code.code] = true
|
||||
}
|
||||
if isNegative(code) {
|
||||
return parseNegative(code, index, codelines)
|
||||
} else if isMapGet(code) {
|
||||
if isMapGet(code) {
|
||||
return mapGetParse(code, index, codelines)
|
||||
} else if !QuickKnownFailures["indexget"+code.code] && isIndexGet(code) {
|
||||
resp, worked, err, i = indexGetParse(code, index, codelines)
|
||||
|
||||
@@ -1,33 +1,45 @@
|
||||
let interpret(code) = do
|
||||
memory = map()
|
||||
let brainfuck(INPUT) = do
|
||||
memory = [0] * 30*1000
|
||||
pointer = 0
|
||||
code_ptr = 0
|
||||
loops = []
|
||||
output = ""
|
||||
i = 0
|
||||
while (i < INPUT.length) do
|
||||
if (INPUT[i] == ">") do
|
||||
pointer += 1
|
||||
else if (INPUT[i] == "<") do
|
||||
pointer -= 1
|
||||
else if (INPUT[i] == "+") do
|
||||
memory[pointer] += 1
|
||||
else if (INPUT[i] == "-") do
|
||||
memory[pointer] -= 1
|
||||
else if (INPUT[i] == ".") do
|
||||
output += chr(memory[pointer])
|
||||
else if (INPUT[i] == ",") do
|
||||
memory[pointer] = ord(input())
|
||||
else if (INPUT[i] == "[") do
|
||||
if (memory[pointer] == 0) do
|
||||
count = 1
|
||||
while (count > 0) do
|
||||
i += 1
|
||||
if (INPUT[i] == "[") do
|
||||
count += 1
|
||||
else if (INPUT[i] == "]") do
|
||||
count -= 1
|
||||
else if (INPUT[i] == "]") do
|
||||
if (memory[pointer] != 0) do
|
||||
count = 1
|
||||
while (count > 0) do
|
||||
i -= 1
|
||||
if (INPUT[i] == "]") do
|
||||
count += 1
|
||||
else if (INPUT[i] == "[") do
|
||||
count -= 1
|
||||
else do
|
||||
pass
|
||||
i += 1
|
||||
term.print(memory)
|
||||
return output
|
||||
|
||||
while (code_ptr < code.length) do
|
||||
command = code[code_ptr]
|
||||
|
||||
if (command == '>') pointer = pointer + 1
|
||||
else if (command == '<') pointer = pointer - 1
|
||||
else if (command == '+') do
|
||||
if (pointer not in memory) memory[pointer] = 0
|
||||
memory[pointer] = memory[pointer] + 1
|
||||
else if (command == '-') do
|
||||
if (pointer not in memory) memory[pointer] = 0
|
||||
memory[pointer] = memory[pointer] - 1
|
||||
else if (command == '.') term.log((memory.get(pointer, 0)))
|
||||
else if (command == ',') memory[pointer] = ord(input())
|
||||
else if (command == '[') do
|
||||
if (memory.get(pointer, 0) == 0) do
|
||||
loop_depth = 1
|
||||
while (loop_depth > 0) do
|
||||
code_ptr = code_ptr + 1
|
||||
if (code[code_ptr] == '[') loop_depth = loop_depth + 1
|
||||
else if (code[code_ptr] == ']') loop_depth = loop_depth - 1
|
||||
else loops.append(code_ptr)
|
||||
else if (command == ']') do
|
||||
if (memory.get(pointer, 0) != 0) code_ptr = loops[-1]
|
||||
else loops.pop()
|
||||
code_ptr = code_ptr + 1
|
||||
|
||||
interpret('>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.>++++++++++.')
|
||||
term.time("brainfuck")
|
||||
term.plain.oneLine(brainfuck(input()))
|
||||
term.timeEnd("brainfuck")
|
||||
Reference in New Issue
Block a user