pipeline-script 0.3.8

Script engine designed for the project construction tool pipeline(crate name pipeline-cli)
Documentation
// MathPlugin功能测试程序
// 测试所有数学函数和自动类型转换功能

extern fn println(obj: Any)

// 三角函数
extern fn sin(x: Double) -> Double
extern fn cos(x: Double) -> Double
extern fn tan(x: Double) -> Double
extern fn asin(x: Double) -> Double
extern fn acos(x: Double) -> Double
extern fn atan(x: Double) -> Double
extern fn atan2(y: Double, x: Double) -> Double

// 双曲函数
extern fn sinh(x: Double) -> Double
extern fn cosh(x: Double) -> Double
extern fn tanh(x: Double) -> Double

// 指数对数函数
extern fn exp(x: Double) -> Double
extern fn exp2(x: Double) -> Double
extern fn ln(x: Double) -> Double
extern fn log10(x: Double) -> Double
extern fn log2(x: Double) -> Double
extern fn pow(base: Double, exponent: Double) -> Double

// 开方函数
extern fn sqrt(x: Double) -> Double
extern fn cbrt(x: Double) -> Double

// 取整函数
extern fn floor(x: Double) -> Double
extern fn ceil(x: Double) -> Double
extern fn round(x: Double) -> Double
extern fn trunc(x: Double) -> Double

// 绝对值函数
extern fn absF64(x: Double) -> Double
extern fn absF32(x: Float) -> Float
extern fn absI64(x: Int64) -> Int64
extern fn absI32(x: Int32) -> Int32

// 最值和限制函数
extern fn maxF64(a: Double, b: Double) -> Double
extern fn minF64(a: Double, b: Double) -> Double
extern fn maxI64(a: Int64, b: Int64) -> Int64
extern fn minI64(a: Int64, b: Int64) -> Int64
extern fn clampF64(value: Double, min: Double, max: Double) -> Double
extern fn clampI64(value: Int64, min: Int64, max: Int64) -> Int64

// 其他数学函数
extern fn fmod(dividend: Double, divisor: Double) -> Double
extern fn factorial(n: Int64) -> Int64
extern fn gcd(a: Int64, b: Int64) -> Int64
extern fn lcm(a: Int64, b: Int64) -> Int64

// 角度弧度转换
extern fn toRadians(degrees: Double) -> Double
extern fn toDegrees(radians: Double) -> Double

// 浮点数状态检查
extern fn isNaN(x: Double) -> Bool
extern fn isInfinite(x: Double) -> Bool
extern fn isFinite(x: Double) -> Bool

// 随机数函数
extern fn random() -> Double
extern fn randomRangeI64(min: Int64, max: Int64) -> Int64
extern fn randomRangeF64(min: Double, max: Double) -> Double

// 数学常量
extern fn PI() -> Double
extern fn E() -> Double
extern fn PHI() -> Double
extern fn LN2() -> Double
extern fn LN10() -> Double
extern fn SQRT2() -> Double

fn main() {
    println("=== MathPlugin 功能测试程序 ===")

    // 测试数学常量
    println("\n--- 数学常量测试 ---")
    println("π (PI):")
    println(PI())
    println("e (自然常数):")
    println(E())
    println("φ (黄金比例):")
    println(PHI())
    println("ln(2):")
    println(LN2())
    println("ln(10):")
    println(LN10())
    println("√2:")
    println(SQRT2())

    // 测试三角函数
    println("\n--- 三角函数测试 ---")
    let angle_deg: Double = 45.0
    let angle_rad = toRadians(angle_deg)

    println("角度: 45°")
    println("弧度:")
    println(angle_rad)
    println("sin(45°):")
    println(sin(angle_rad))
    println("cos(45°):")
    println(cos(angle_rad))
    println("tan(45°):")
    println(tan(angle_rad))

    // 测试反三角函数
    println("\n--- 反三角函数测试 ---")
    let sin_val = sin(angle_rad)
    println("asin(sin(45°)) 转换回角度:")
    println(toDegrees(asin(sin_val)))

    // 测试指数对数函数
    println("\n--- 指数对数函数测试 ---")
    let base: Double = 2.0
    let exponent: Double = 3.0
    println("2³ = ")
    println(pow(base, exponent))
    println("e² = ")
    println(exp(2.0))
    println("ln(e²) = ")
    println(ln(exp(2.0)))
    println("log₁₀(100) = ")
    println(log10(100.0))
    println("log₂(8) = ")
    println(log2(8.0))

    // 测试开方函数
    println("\n--- 开方函数测试 ---")
    println("√16 = ")
    println(sqrt(16.0))
    println("∛27 = ")
    println(cbrt(27.0))

    // 测试取整函数
    println("\n--- 取整函数测试 ---")
    let test_val: Double = 3.7
    println("原值: 3.7")
    println("floor(3.7) = ")
    println(floor(test_val))
    println("ceil(3.7) = ")
    println(ceil(test_val))
    println("round(3.7) = ")
    println(round(test_val))
    println("trunc(3.7) = ")
    println(trunc(test_val))

    // 测试绝对值函数
    println("\n--- 绝对值函数测试 ---")
    println("abs(-5.5) = ")
    println(absF64(-5.5))
    println("abs(-42) = ")
    println(absI64(-42))

    // 测试最值函数
    println("\n--- 最值函数测试 ---")
    println("max(3.14, 2.71) = ")
    println(maxF64(3.14, 2.71))
    println("min(100, 50) = ")
    println(minI64(100, 50))
    println("clamp(15, 0, 10) = ")
    println(clampI64(15, 0, 10))

    // 测试其他数学函数
    println("\n--- 其他数学函数测试 ---")
    println("5! = ")
    println(factorial(5))
    println("gcd(48, 18) = ")
    println(gcd(48, 18))
    println("lcm(12, 18) = ")
    println(lcm(12, 18))
    println("fmod(10.5, 3.0) = ")
    println(fmod(10.5, 3.0))

    // 测试浮点数状态检查
    println("\n--- 浮点数状态检查测试 ---")
    let normal_val: Double = 3.14
    let inf_val = 1.0 / 0.0
    let nan_val = 0.0 / 0.0

    println("isFinite(3.14):")
    println(isFinite(normal_val))
    println("isInfinite(1/0):")
    println(isInfinite(inf_val))
    println("isNaN(0/0):")
    println(isNaN(nan_val))

    // 测试随机数函数
    println("\n--- 随机数函数测试 ---")
    println("random():")
    println(random())
    println("randomRangeI64(1, 10):")
    println(randomRangeI64(1, 10))
    println("randomRangeF64(0.0, 1.0):")
    println(randomRangeF64(0.0, 1.0))

    // 测试自动类型转换
    println("\n--- 自动类型转换测试 ---")
    let float_val: Float = 3.14
    let double_val: Double = 2.71

    println("Float值: 3.14")
    println("Double值: 2.71")

    println("Float + Double = ")
    println(float_val + double_val)  // 应该自动转换为Double

    println("Float * Double = ")
    println(float_val * double_val)  // 应该自动转换为Double

    println("Float > Double ? ")
    println(float_val > double_val)  // 应该自动转换后比较

    // 综合数学计算示例
    println("\n--- 综合计算示例 ---")
    println("计算圆的面积和周长 (半径 = 5.0):")
    let radius: Double = 5.0
    let area = PI() * pow(radius, 2.0)
    let circumference = 2.0 * PI() * radius

    println("面积 = π × r² = ")
    println(area)
    println("周长 = 2 × π × r = ")
    println(circumference)

    println("\n二次方程求解 (x² - 5x + 6 = 0):")
    let a: Double = 1.0
    let b: Double = -5.0
    let c: Double = 6.0
    let discriminant = pow(b, 2.0) - 4.0 * a * c

    println("判别式 = b² - 4ac = ")
    println(discriminant)

    if discriminant >= 0.0 {
        let x1 = (-b + sqrt(discriminant)) / (2.0 * a)
        let x2 = (-b - sqrt(discriminant)) / (2.0 * a)
        println("x1 = ")
        println(x1)
        println("x2 = ")
        println(x2)
    } else {
        println("方程无实数解")
    }

    println("\n=== 测试完成 ===")
    println("所有MathPlugin功能测试已完成!")
}