0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

汎用プリプロセッサm4を使う。 Rustでの使用例。

Last updated at Posted at 2024-10-21

汎用プリプロセッサ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で書ける。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?