PLUGIN_DEVELOPMENT.md 7.7 KB

IJS 插件开发文档 (v1.1)

目录


插件结构

插件是 JSON 格式的配置文件,包含以下字段:

{
  "id": "plugin_id",
  "name": "插件名称",
  "description": "插件描述",
  "icon": "📐",
  "command": "cmd",
  "inputs": [
    {
      "name": "input1",
      "label": "输入标签",
      "defaultValue": "0",
      "placeholder": "提示文本"
    }
  ],
  "jsCode": "function calculate(inputs, Symja) { ... }"
}

字段说明

  • id - 插件唯一标识符
  • name - 插件显示名称
  • description - 插件功能描述
  • icon - 插件图标(emoji)
  • command - 快捷命令(可选),用于命令行执行
  • inputs - 输入参数数组
    • name - 参数名称(代码中访问)
    • label - 参数标签(显示给用户)
    • defaultValue - 默认值(可选)
    • placeholder - 提示文本(可选)
  • jsCode - 插件计算代码

快速开始

示例 1:圆面积计算器

{
  "id": "circle_area",
  "name": "圆面积计算器",
  "description": "计算圆的面积",
  "icon": "⭕",
  "command": "circle",
  "inputs": [
    {
      "name": "radius",
      "label": "半径",
      "defaultValue": "1",
      "placeholder": "输入半径"
    }
  ],
  "jsCode": "function calculate(inputs, Symja) {\n  const r = inputs.radius;\n  if (!r || parseFloat(r) <= 0) {\n    throw new Error('半径必须是正数');\n  }\n  Symja.print(`计算半径为 ${r} 的圆面积`);\n  return `Pi*${r}^2`;\n}"
}

使用方式:

  • 对话框:点击插件图标打开
  • 命令行:circle[5] 直接计算半径为 5 的圆面积
  • 结果引用:% 可引用上次结果,如 % /. Pi->3.14

示例 2:导数计算器

{
  "id": "derivative_calculator",
  "name": "导数计算器",
  "description": "计算函数的导数",
  "icon": "📈",
  "command": "deriv",
  "inputs": [
    {
      "name": "function",
      "label": "函数表达式",
      "defaultValue": "x^2 + 3*x",
      "placeholder": "例如: x^2 + 3*x"
    },
    {
      "name": "variable",
      "label": "变量",
      "defaultValue": "x",
      "placeholder": "例如: x"
    }
  ],
  "jsCode": "function calculate(inputs, Symja) {\n  const func = inputs.function;\n  const variable = inputs.variable;\n  if (!func || !variable) {\n    throw new Error('请输入函数和变量');\n  }\n  Symja.print(`对 ${func} 关于 ${variable} 求导`);\n  return Symja.differentiate(func, variable);\n}"
}

使用方式:

  • 命令行:deriv[x^3, x] 计算 x³ 的导数
  • 列表参数:deriv[{x^2, x^3}, x] 列表作为一个参数

插件代码规范

v1.1 核心特性

  1. 输入自动转换

    • 用户输入会自动验证并转换为 Symja 可运算类型
    • 插件可直接使用 inputs.xxx 进行计算
  2. Symja.print() 输出

    • 用于输出说明文本,不影响返回值
    • 示例:Symja.print('计算中...')
  3. 返回值要求

    • 必须返回有效的 Symja 表达式(如 'x^2'、'Pi*r^2')
    • 系统会自动验证返回值
    • 返回值可通过 % 在后续计算中引用
  4. 命令执行语法

    • 定义 command 字段后,可用 command[arg1, arg2] 直接执行
    • 支持列表参数:command[{1,2}, {3,4}] 有 2 个参数
    • 支持嵌套:command[{{1,2},{3,4}}] 矩阵作为 1 个参数
  5. 自动补全

    • 输入命令时自动提示参数
    • 按 Tab 或点击补全

代码模板

function calculate(inputs, Symja) {
  // 1. 获取输入(已自动转换为可运算类型)
  const param1 = inputs.param1;
  
  // 2. 输入验证
  if (!param1) {
    throw new Error('请输入参数');
  }
  
  // 3. 输出说明信息(可选)
  Symja.print('正在计算...');
  
  // 4. 执行计算
  const result = Symja.eval(`SomeFunction[${param1}]`);
  
  // 5. 返回可运算的 Symja 表达式
  return result;
}

重要规则

  • ✅ 函数签名必须是 function calculate(inputs, Symja) { ... }
  • ✅ 输入值自动转换,可直接用于计算
  • ✅ 必须返回有效的 Symja 表达式
  • ✅ 使用 Symja.print() 输出说明,不影响返回值
  • ✅ 使用 throw new Error() 抛出错误
  • ✅ 所有 Symja API 参数都是字符串类型

Symja API 完整参考

输入输出

API 说明 示例
inputs.xxx 获取输入参数(已自动转换) inputs.radius
Symja.print(msg) 输出说明文本 Symja.print('计算中...')
return expr 返回可运算表达式 return 'Pi*r^2'

基础计算

API 说明 示例
Symja.eval(expr) 执行任意 Symja 表达式 Symja.eval('2+2')

微积分

API 说明 示例
differentiate(expr, var) 求导数 Symja.differentiate('x^2', 'x')
integrate(expr, var) 求不定积分 Symja.integrate('x^2', 'x')
limit(expr, var, point, dir) 求极限 Symja.limit('Sin[x]/x', 'x', '0')
series(expr, var, point, order) 泰勒级数 Symja.series('Exp[x]', 'x', '0', '5')

代数运算

API 说明 示例
solve(eq, var) 解方程 Symja.solve('x^2-4==0', 'x')
simplify(expr) 化简 Symja.simplify('(x^2-1)/(x-1)')
expand(expr) 展开 Symja.expand('(x+1)^3')
factor(expr) 因式分解 Symja.factor('x^2-4')
apart(expr, var) 部分分式 Symja.apart('1/(x^2-1)', 'x')
together(expr) 通分 Symja.together('1/x + 1/y')
trigSimplify(expr) 三角化简 Symja.trigSimplify('Sin[x]^2+Cos[x]^2')

求和与求积

API 说明 示例
sum(expr, var, start, end) 求和 Symja.sum('i^2', 'i', '1', '10')
product(expr, var, start, end) 求积 Symja.product('i', 'i', '1', '5')

矩阵运算

API 说明 示例
matrix.det(matrix) 行列式 Symja.matrix.det('{{1,2},{3,4}}')
matrix.inverse(matrix) 逆矩阵 Symja.matrix.inverse('{{1,2},{3,4}}')
matrix.transpose(matrix) 转置 Symja.matrix.transpose('{{1,2},{3,4}}')
matrix.eigenvalues(matrix) 特征值 Symja.matrix.eigenvalues('{{1,2},{3,4}}')
matrix.rank(matrix) 矩阵秩 Symja.matrix.rank('{{1,2},{3,4}}')

数论

API 说明 示例
gcd(a, b) 最大公约数 Symja.gcd('12', '18')
lcm(a, b) 最小公倍数 Symja.lcm('12', '18')
factorInteger(n) 质因数分解 Symja.factorInteger('60')
isPrime(n) 判断素数 Symja.isPrime('17')

组合数学

API 说明 示例
fibonacci(n) 斐波那契数 Symja.fibonacci('10')
binomial(n, k) 组合数 C(n,k) Symja.binomial('5', '2')

数值计算

API 说明 示例
numeric(expr, precision) 高精度数值计算 Symja.numeric('Pi', '50')

LaTeX 支持

API 说明 示例
toTeX(expr) 转换为 LaTeX Symja.toTeX('x^2 + 2*x + 1')
renderLatex(latex) 渲染 LaTeX Symja.renderLatex('\\frac{1}{2}')

插件位置

插件文件保存在:

/storage/emulated/0/Android/data/com.nonvioce.ijs/files/plugins/

可以直接在该目录创建 .json 文件来添加插件。