Skip to content

Yeqi99/Magic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

182 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Magic logo

Magic

Magic turns software capabilities into compact, machine-readable semantics that humans can write, agents can understand, and runtimes can safely execute.

Magic 将软件能力转化为紧凑、机器可读的语义:人可以书写,智能体可以理解,运行时可以安全执行。

English | 中文 | Docs

MagicPaper proof-of-use integration: Yeqi99/MagicPaper

Magic 是一个面向接入方的 Java 脚本语言内核。它的设计目标不是把语法做得像传统编程语言一样华丽,而是尽量做到“0 代码糖”:把表达能力交给语义函数,把控制流、变量、容器、环境能力都抽象成可注册、可替换、可组合的语义。

换句话说,Magic 希望在同样的文本量里存储更多可执行逻辑,并让第三方项目可以快速把自己的业务能力接入为一组短语义。Minecraft 方向的 MagicPaper 是当前最完整的落地实现;MagicRedis 则是 Magic 在实际应用场景中的另一个范例。

当前实现

Magic 基于 Java 17 和 Maven 构建。

Magic 当前已经实现了一个可嵌入的解释执行核心:

  • MagicManager:语义注册与执行管理器,维护函数、别名和语义优先级。
  • FastExpression / FunctionManager / AliasesManager:负责解析 name(args) 形式的表达式、函数注册和别名映射。
  • Spell:一组 Magic 语句,按行顺序执行。
  • MagicWords:一行 Magic 语句,一行中可以包含多个语义函数。
  • ContextMap / NormalContext:运行时上下文,用于存储变量、公共对象和执行状态。
  • SpellContext:单次执行过程中的上下文,记录返回值、错误、打印日志、跳转与控制信息。
  • MagicPackage / MagicInstance:加载 .m 文件,并将文件中的魔咒导入到上下文。

内置语义覆盖了脚本语言的基础能力:

  • 算术:加、减、乘、除、取模、幂、整除、自计算。
  • 比较与逻辑:比较、相等、忽略大小写相等、与、或、异或、非。
  • 变量:变量定义、对象定义、读取、写入、存在性判断、上下文读取。
  • 容器:列表、集合、映射、参数集合、随机取值、解包。
  • 控制流:ififNotwhile、遍历、返回、中断、跳转、跳过、等待。
  • 执行:执行 Spell、执行带参数 Spell、加载上下文、eval、异步执行、守护异步执行。
  • 输入输出:控制台输入、打印、导入。
  • 信息:执行次数、当前语句序号、长度、类型、时间、范围、自身引用、空值判断。
  • 扩展:Java 类反射、别名注册、自定义函数注册、列表排序、字符串拆分。

基本语法

Magic 的基本单元是语义函数:

print(hello world)

参数默认按空格拆分;嵌套函数会先被解析并返回结果:

vdef(name str(Magic))
print(name)
print(add(1 2))

一组语句组成一个 Spell

vdef(playerName str(Yeqi))
print(playerName)
return(playerName)

Magic 的重点是“语义优先”。例如在 Minecraft 中,player()item()stap() 这类能力不是语言内核写死的,而是由 MagicPaper 注册进来的环境语义。

在 Java 中接入

最小接入方式如下:

import cn.origincraft.magic.MagicManager;
import cn.origincraft.magic.function.FunctionRegister;
import cn.origincraft.magic.object.NormalContext;
import cn.origincraft.magic.object.Spell;
import cn.origincraft.magic.object.SpellContext;

import java.util.List;

MagicManager manager = new MagicManager();
FunctionRegister.regDefault(manager);

NormalContext context = new NormalContext();
Spell spell = new Spell(List.of(
        "vdef(name str(Magic))",
        "print(name)",
        "return(name)"
), manager);

SpellContext result = spell.execute(context);

第三方接入通常只需要做三件事:

  1. 创建并持有一个 MagicManager
  2. 调用 FunctionRegister.regDefault(manager) 注册系统语义。
  3. 继承 ArgsFunctionOnlyStringFunction,把自己的环境能力注册成语义函数。

函数注册示例:

manager.registerFunction(new YourFunction(), "alias1", "alias2");

如果你的项目只希望复用 Magic 的执行模型,也可以只注册自己的语义,不启用默认系统语义。

命令行 CLI

Magic 提供一个命令行入口 magic。它既可以像脚本解释器一样运行 .m 文件,也可以进入交互式调试台,还可以创建类似 Python 虚拟环境体验的 Magic env。

常用命令:

magic repl
magic run script.m
magic eval "print(hello world)"
magic env create dev
magic env use dev
magic env list
magic http --port 22329

全局选项:

magic repl --env dev
magic run script.m --env dev
magic eval "print(hello)" --no-import
magic env home

Magic env 是一个独立的工作上下文目录,默认位于 ~/.magic/envs/<name>。每个 env 都有自己的 spells/ 目录,CLI 启动时会把该目录下的 .m 文件导入为 env.<envName>.<fileName> 变量。这样可以像 Python 的虚拟环境一样,为不同项目、服务器或实验隔离上下文。

终端调试台

进入 REPL:

magic repl

在 REPL 中,直接输入 Magic 语句会加入当前缓冲区:

magic(default:0)> vdef(name str(Magic))
added #1
magic(default:1)> print(name)
added #2
magic(default:2)> :run

REPL 命令以 : 开头,也兼容旧调试台的 / 前缀:

:run, :go                 执行当前缓冲区
:run <file.m>             执行文件
:eval <words>             立即执行一行 Magic 语句
:buffer, :look            查看当前缓冲区
:clear                    清空缓冲区
:save <name> [directory]  保存缓冲区为 .m 文件,默认保存到当前 env 的 spells/
:import <dir> [id]        导入目录下的 .m 文件为 id.* 变量
:reset                    重置上下文,并重新导入当前 env 的 spells/
:context                  查看当前上下文变量和对象
:functions [filter]       查看已注册语义
:aliases <function>       查看语义别名
:env list|create|use|path 管理 env
:home                     查看 Magic home
:exit                     退出

安装方式

安装前需要本机已经有 Java 17 或更高版本。

Linux 一条命令:

mkdir -p "$HOME/.magic" && curl -fsSL https://github.com/Yeqi99/Magic/releases/download/latest/magic-cli.tar.gz | tar -xz -C "$HOME/.magic" --strip-components=1 && { grep -qxF 'export PATH="$HOME/.magic/bin:$PATH"' "$HOME/.bashrc" 2>/dev/null || echo 'export PATH="$HOME/.magic/bin:$PATH"' >> "$HOME/.bashrc"; } && export PATH="$HOME/.magic/bin:$PATH" && magic repl

macOS 一条命令:

mkdir -p "$HOME/.magic" && curl -fsSL https://github.com/Yeqi99/Magic/releases/download/latest/magic-cli.tar.gz | tar -xz -C "$HOME/.magic" --strip-components=1 && { grep -qxF 'export PATH="$HOME/.magic/bin:$PATH"' "$HOME/.zshrc" 2>/dev/null || echo 'export PATH="$HOME/.magic/bin:$PATH"' >> "$HOME/.zshrc"; } && export PATH="$HOME/.magic/bin:$PATH" && magic repl

Windows PowerShell 一条命令:

$m="$HOME\.magic"; $t=Join-Path $env:TEMP "magic-install"; Remove-Item $t -Recurse -Force -ErrorAction SilentlyContinue; New-Item -ItemType Directory -Force $m,$t | Out-Null; Invoke-WebRequest "https://github.com/Yeqi99/Magic/releases/download/latest/magic-cli.zip" -OutFile "$t\magic-cli.zip"; Expand-Archive "$t\magic-cli.zip" -DestinationPath $t -Force; Copy-Item "$t\Magic\*" $m -Recurse -Force; $bin="$m\bin"; $path=[Environment]::GetEnvironmentVariable("Path","User"); if (($path -split ';') -notcontains $bin) { [Environment]::SetEnvironmentVariable("Path", "$bin;$path", "User") }; $env:Path="$bin;$env:Path"; magic repl

如果命令执行完成后当前终端已经能进入 magic repl,以后新开的终端也可以直接使用:

magic repl

开发者也可以从源码构建并安装:

mvn package

Linux / macOS 源码安装:

sh scripts/install.sh
export PATH="$HOME/.magic/bin:$PATH"
magic repl

Windows PowerShell 源码安装:

powershell -ExecutionPolicy Bypass -File scripts\install.ps1
$env:Path="$HOME\.magic\bin;$env:Path"
magic repl

安装脚本会把 jar 放到 ~/.magic/lib/magic.jar,并在 ~/.magic/bin 中生成 magic 启动脚本。也可以通过 MAGIC_HOME 或安装脚本的 prefix 参数指定安装目录。

不安装也可以直接运行构建产物:

java -jar target/Magic-*.jar repl
java -jar target/Magic-*.jar run script.m

HTTP 调试入口

如果需要保留外部调用方式,可以启动 HTTP 调试服务:

magic http --port 22329 --env default

发送 POST /magic,请求体可以是表单:

Spell=print(hello)&Env=default

也可以直接发送纯文本 Magic 语句。HTTP 模式会复用指定 env 的上下文,适合给编辑器、网页调试面板或其他工具调用。

发布与自动构建

仓库使用 GitHub Actions 自动构建 Magic:

  • push 到 master / main:自动构建,保存 magic-latest 工作流产物,并更新 latest Release。
  • pull request:自动构建校验。
  • 推送 v* tag 或发布 GitHub Release:自动构建并上传 Release 资产。

发布一个新版本时,只需要打 tag 并推送:

git tag vX.Y.Z
git push origin vX.Y.Z

自动发布的 Release 资产包括:

magic.jar
magic-cli.zip
magic-cli.tar.gz
SHA256SUMS

也可以先在 GitHub 创建 Release;Release 发布后,CI/CD 会自动把最新构建产物上传到该 Release。

项目结构

src/main/java/cn/origincraft/magic
  expression/     表达式、函数注册、别名管理
  function/       函数抽象、内置语义、返回值类型
  manager/        .m 包加载与 Magic 实例
  object/         Spell、MagicWords、上下文对象
  utils/          解析、文件、错误、变量、结果等工具

src/test/java
  Test.java       最小执行示例
  SimpleIDE.java  简单 Swing 语义提示实验
  example.m       示例 Magic 语句

生态位置

  • Magic:语言核心与解释执行框架。
  • MagicPaper:把 Magic 接入 Paper / Folia 服务器,提供 Minecraft 领域语义。
  • MagicRedis:Magic 语言在实际应用中的范例,用于验证语言在非 Minecraft 环境里的可接入性。

Magic 的长期方向不是替代宿主项目的 Java 代码,而是让宿主项目把复杂能力沉淀为语义,最终让使用者用更少文本编排更多逻辑。

未来预期

  • 继续稳定语法解析、错误提示、上下文隔离和执行安全。
  • 为语义函数生成更完整的自描述文档,让接入方和使用者不依赖外部站点也能查到用法。
  • 完善语义包、导入机制和第三方扩展约定,降低其他项目接入 Magic 的成本。
  • 在 MagicPaper、MagicRedis 等实际项目中反向验证语言设计,保留足够小的核心,避免把环境能力写死进语言内核。
  • 在样本足够后探索自然语言到 Magic 语义的转换,让不同语言的用户可以更低门槛地生成 Magic 脚本。

开源协议

本项目采用 GNU GPL-3.0 许可证。使用、修改和分发本项目代码时,请遵循 GPL-3.0 的相关要求。

Packages

 
 
 

Contributors

Languages