// Clyx programming language interpreter, Go implementation wrapper // Created by Luxferre in 2026, released into the public domain package main import ( "archive/zip" _ "embed" "fmt" "io" "os" "strings" clyx "code.luxferre.top/luxferre/clyx/clyx-go" ) //go:embed lib.clx var defaultLibCode string //go:embed clyx_repl.clx var defaultReplCode string func runZipArchive(zr *zip.Reader) error { defer func() { if r := recover(); r != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", r) os.Exit(1) } }() c := clyx.NewClyx("", defaultLibCode) for _, file := range zr.File { if !file.FileInfo().IsDir() && strings.HasSuffix(strings.ToLower(file.Name), ".clx") { rc, err := file.Open() if err != nil { return fmt.Errorf("error opening %s in archive: %w", file.Name, err) } data, err := io.ReadAll(rc) rc.Close() if err != nil { return fmt.Errorf("error reading %s in archive: %w", file.Name, err) } c.Run(string(data)) } } if c.HasWord("_main") { c.Run("_main") } else { c.Run(defaultReplCode) } return nil } func detectAndRunZip() bool { exePath, err := os.Executable() if err != nil { return false } f, err := os.Open(exePath) if err != nil { return false } defer f.Close() info, err := f.Stat() if err != nil { return false } zr, err := zip.NewReader(f, info.Size()) if err != nil { return false // No ZIP appended } // ZIP found! Run it if err := runZipArchive(zr); err != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", err) os.Exit(1) } return true } func runFiles(files []string) { defer func() { if r := recover(); r != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", r) os.Exit(1) } }() c := clyx.NewClyx("", defaultLibCode) for _, filePath := range files { content, err := os.ReadFile(filePath) if err != nil { fmt.Fprintf(os.Stderr, "Error executing %s: %v\n", filePath, err) os.Exit(1) } c.Run(string(content)) } if c.HasWord("_main") { c.Run("_main") } } func main() { if detectAndRunZip() { return } if len(os.Args) > 1 { runFiles(os.Args[1:]) } else { defer func() { if r := recover(); r != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", r) os.Exit(1) } }() clyx.NewClyx("", defaultLibCode).Run(defaultReplCode) } }