macro_lisp

Crates.iomacro_lisp
lib.rsmacro_lisp
version0.2.0
sourcesrc
created_at2016-12-19 06:05:06.790966
updated_at2023-06-24 02:03:25.783878
descriptionLisp-like DSL for Rust language.
homepage
repositoryhttps://github.com/JunSuzukiJapan/macro-lisp
max_upload_size
id7673
size28,420
(JunSuzukiJapan)

documentation

README

macro-lisp

Lisp-like DSL for Rust language. Build Status MIT License

Installation

include the following in your Cargo.toml file:

[dependencies]
macro_lisp="0.1.0"

And then import the library using:

extern crate macro_lisp;

use macro_lisp::lisp;

Examples

factorial

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));

wc

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)
);

License

MIT

Commit count: 73

cargo fmt