2 unstable releases

Uses old Rust 2015

0.2.0 Jun 24, 2023
0.1.0 Dec 19, 2016

#765 in Rust patterns

23 downloads per month

Custom license

17KB
263 lines

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

No runtime deps