1个不稳定版本

使用旧的Rust 2015

0.1.0 2017年12月9日

#967编程语言


piske 中使用

MIT 许可证

14KB
277

Piske

Build Status Documentation

Piske是一种为创建生成艺术而设计的领域特定编程语言。Piske的主要目标是提供简洁、易于理解的语法和语义,以方便生成各种算法图像。

目前,功能有限,仅考虑了非常特定的用例。Piske目前可以生成图像,其中每个像素的值由对应二维平面上值的某种计算确定。具体来说,这包括生成许多类型的分形图像。

示例

let height = 1024;
let width = 1024;
set_image_dims(height, width);

let camera_center = -0.5 + 0i;
let camera_size = 3 + 3i;

let threshold = 10;
let num_max_iters = 1000;

iterate row = [0, height) {
    iterate col = [0, width) {
        let z = 0 + 0i;
        let c = project(row, col, camera_center, camera_size);
        let value = iterate over [0, num_max_iters) {
            z = z * z + c;
            let escape_value = re(z * z`);
            if escape_value > threshold {
                break escape_value;
            }
            0.0
        };
        set_pixel_data(row, col, value);
    }
}

write("mandelbrot.png");

mandelbrot fractal

功能

pske包含的一些功能包括

  • 典型的编程语言结构(循环、if/else、函数定义和调用)
  • 简化后的类似Rust的语法
  • if-then结构和循环结构被视为表达式(即它们有返回值)
  • 标准函数用于操作图像尺寸、图像数据和从像素空间到场景空间的投影
  • 数学式符号,例如区间表示法(例如,[0, 10) 表示从0(包含)到10(不包含)的范围)和复数(例如,1 + 2i 被解释为实部为1.0,虚部为2.0的复数)
  • 静态类型和推断类型
  • 既可解释又可转换为Rust

用法

Piske可以交互式使用,作为解释器,或转换为Rust的转译器。

交互式外壳

$ piske
>> let a = 5;
5
>> a
5
>> a + 3
8
>> a = if a + 3 > 6 { 10 } else { 0 }
10
>> a
10

解释器

解释psk文件很简单。例如,给定一个名为test.psk的文件,其中包含以下内容

let a = 5;
print a + 3;

可以通过执行以下操作来解释此文件

$ piske test.psk
8

转译器

对于大多数应用程序,将代码转换为Rust将是为了性能的最佳选择。这目前是一个两步过程

$ piskec test.psk ./test_proj_dir
$ cd test_proj_dir
$ ls
Cargo.toml   src
$ cargo run
    Updating registry `https://github.com/rust-lang/crates.io-index`
   ...
   Compiling a bunch libraries
   ...
   Compiling psk_std v0.1.0
   Compiling test_proj_dir v0.1.0 (file:///home/jamie/devel/piske_examples/test_proj_dir)
    Finished dev [unoptimized + debuginfo] target(s) in 14.78 secs
     Running `target/debug/test_proj_dir`
8

第一步将psk代码文件转换为指定目录中的Rust项目。然后,使用Rust cargo命令构建和运行转换后的代码来执行代码。

当前和未来的 piske 状态

如前所述,piske 的功能目前有限。许多特性计划在未来的版本中实现,但尚未实现。

piske 目前处于 ALPHA 状态;它具有基本功能,但存在错误、未经测试且可能发生变化。

计划未来的功能包括

  • 结构体和结构体成员访问,这应该可以提高语言的简洁性(例如,拥有一个具有中心和尺寸的 camera 结构体,而不是将它们视为两个单独的复杂数字)
  • 特殊的迭代语法,例如,遍历目标图像中的每个像素
  • 替代的图像生成方法(例如,分布采样、路径追踪)
  • 对如何从图像数据数组生成图像像素值的更多控制(目前 write 函数做出了一些假设,您希望得到类似分形的外观)
  • matrix 库的集成,允许进行基于矩阵的图像数据处理
  • 可能的隐式并发
  • 颜色(图像生成目前仅为灰度)
  • 解释器性能改进
  • 更易于使用的转译器,其中 piskec foo.psk 将简单地生成一个可执行文件
  • 大量的测试和错误修复!

lib.rs:

piske 的标准库。

依赖项

~1.5MB
~30K SLoC