2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2023 年 6 月 24 日
0.1.0 2016 年 12 月 19 日

#1063Rust 模式

每月 31 下载

自定义许可协议

17KB
263 代码行

macro-lisp

Rust 语言类似 Lisp 的 DSL。 构建状态 MIT 许可协议

安装

在您的 Cargo.toml 文件中包含以下内容

[dependencies]
macro_lisp="0.1.0"

然后使用以下方式导入库

extern crate macro_lisp;

use macro_lisp::lisp;

示例

阶乘

extern crate macro_lisp;

use macro_lisp::lisp;

lisp!(defun factorial ((n i32)) i32
  (if (<= n 1)
    1
    (* n (factorial (- n 1)))));

lisp!(defun main () ()
    (defconstant num (factorial 10))
    (println "10! = {}" num));

计数器

extern crate macro_lisp;

use macro_lisp::lisp;

lisp!(use std::env);
lisp!(use std::process::exit);

lisp!(defun is_whitespace ((b u8)) bool
    (match b
        (0x20 | 0x09 | 0x85 | 0x0a | 0x0b | 0x0c | 0x0d => (true))
        (_ => (false) ))
);

lisp!(defun main () ()
    (defconstant (args Vec<String>) env::args().collect())
    (if (< (len args) 2)
        (progn
            (println "usage: wc file")
            (exit 0)))

    (defvar char_count 0)
    (defvar word_count 0)
    (defvar line_count 0)
    (defvar in_word false)

    (defconstant path &args[1])
    (with-input-from-file (file path)
        (doiter (byte file.bytes())
            (incf char_count)

            (defconstant b byte.unwrap())
            (if (== b 0x0a)
                (incf line_count))

            (if in_word
                (if (is_whitespace b)
                    (setf in_word false))
                (if (! (is_whitespace b))
                    (progn
                        (setf in_word true)
                        (incf word_count))))))

    (println "{:>10} {:>10} {:>10} {}" line_count word_count char_count path)
);

许可协议

MIT

无运行时依赖