Windows Dev. Site

IronScheme

今年最初の投稿は、新年早々IronSchemeです。(^^;

前回、Clojureをまわりを調べているときに、この存在を知り試してみようと思いました。
.NETフレームワークのライブラリが使用できるSchemeということですが、IronPython, IronRubyと同じように位置づけなのでしょう。

Lisp (+ List Processor))

http://decode.red/blog/20141201244/

ここで使用した順列のプログラムをIronSchemeで動かしてみました。

環境 : Windows 8.1

https://ironscheme.codeplex.com/

IronScheme-109887.zip

perm.ss

(import (srfi :1 lists))

(define (perm ls a)
    (if (null? ls)
        (display (reverse a))
        (for-each
            (lambda (n)
                (perm (remove (lambda (a) (equal? a n)) ls)(cons n a)))
            ls)))

(perm '(1 2 3) '())
(newline)

冒頭のimportの記述や、コマンド実行時ファイル指定の方法にちょっと迷いました。

hello.ss

(import (rnrs))

(display "Hello")
(newline)

上の二つのプログラムをそれぞれ以下のように実行しました。

IronScheme02

最初、srfiの指定方法がいけないのかどちらかわかりませんでしたが、リダイレクトの方法だとうまくいくので、とりあえずこのままにしました。

次に、下記サイトを参考に、VisualStduio 2013を使ってC#から呼び出してみました。

http://cryks.hateblo.jp/entry/20120417/1334660328

インストールは、NuGetを使いました。
IronScheme01

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using IronScheme;
using IronScheme.Runtime;

namespace csConsScheme01
{
    class Program
    {
        static void Main(string[] args)
        {
             Console.WriteLine("(+ 1 2 3)".Eval());
             Console.ReadKey();

             "(define (add x y)(+ x y))".Eval();
             var add = "add".Eval<Callable>();
             Console.WriteLine(add.Call(1, 2));
        }
    }
}

出力は、6と3です。
特定の処理だけ組み込み言語的に使う用途にいいかもしれません。