汎用プリプロセッサm4を使ってみます。
まず、インストール。ここでは、試験環境はArchLinux。
sudo pacman -S m4
Rustでの、popの記述が面倒だったので、popを処理します。
以下のスクリプトを書きました。
popi32.m4
define(`popi32',`let $1:i32=match $2.`pop'() { Some(value)=>value,None=>1 }')
define(`len',``len()'')dnl len()マクロを文字リテラルlen()に置き換える
dnl以降はコメントです。Rustのlenが、m4のlenと被るので。
m4のマクロをクォートする処理はもっとベターなものがあると思いますが。
Rustのメインスクリプト。
エラトステネスのふるいで素数を発生するスクリプトです。
sieve.m4
include(`popi32.m4')
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let n=&args[1];
let n:i32=n.parse().unwrap();
let f:Vec <i32>=sieve(n);
let l:i32=f.len() as i32;
println! ("{:?} : {:?} ",l,f);
}
fn sieve(n:i32)->Vec<i32> {
let mut tab:Vec<i32>=(2..=n).rev().collect();
let mut l:Vec<i32>=vec![];
while !tab.is_empty() {
popi32(v,tab);
l.push(v);
tab.retain(|&x| x%v !=0);
}
l
}
プリプロセッサ処理&コンパイル
$ m4 sieve.m4>sieve.rs
$ rustc sieve.rs
実行
$ ./sieve 100
動作しました。
一般アセンブラはオブジェクトファイル生成は別にして、m4で書ける。
コンパイラもm4で書ける。