crossframe » Lisp http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 Scheme Shell / Cygwin ../../../201504051009/ ../../../201504051009/#comments Sun, 05 Apr 2015 02:05:50 +0000 ../../../?p=1009 CygwinというWindows上でLinuxコマンドを実行できるとても便利なツールとして、これまでいろんなケースで使ってきました。
最近のマイブームによりSCSHというSchemeによるシェルを実行する環境を探していたとき、Ubuntuとかでチャレンジしたのですが、インストールがうまくいかず、結局このCygwinにいきつきました。さすがです!
SCSHは、一見Gaucheとも似ているように見えるのですが、Shellですので、実行コマンドを式に組み込めるところが面白いと思いました。
環境 : Windows 8.1
scsh03
Cygwinは32bit版である必要があります。

以下の例は、実行プログラムをシェルの中から呼んだみました。
スラッシュが式に使えるのが、ポイントだと思っています。
scsh01
scsh -c で式をパラメータに与えても実行できます。

また、PowerShellでも動きます。(コマンドレットは動作しません)
Cygwinのbinにパスを通しておく必要があります。
scsh02
(上記、(run (| (echo 123 + 456) (bc) (cat)) (> tempfile)) という、書き方も可です。)

http://scsh.net/

本家サイトを見ると、
The latest version of scsh is 0.6.7, released May 16, 2006:
ということで、ちょっと残念です。
この時点で動作させられるという記録を残しておく意味でも、とりあげてみました。
(こういうのBlogの役割かも)

参考サイト:
http://wiki.call-cc.org/eggref/4/scsh-process (以前取り上げたChickenSchemeのサイトにもあります。)

http://www.drdobbs.com/systems-administration-with-scsh/199101322

すばらしいです。

]]>
../../../201504051009/feed/ 0
IronScheme ../../../20150104956/ ../../../20150104956/#comments Sun, 04 Jan 2015 03:57:05 +0000 ../../../?p=956 今年最初の投稿は、新年早々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です。
特定の処理だけ組み込み言語的に使う用途にいいかもしれません。

]]>
../../../20150104956/feed/ 0
calling Clojure from C# ../../../20141206942/ ../../../20141206942/#comments Sat, 06 Dec 2014 14:43:22 +0000 ../../../?p=942 .NETフレームワークがオープンソースになるということですが、C#のプログラムがJavaのようにクロスプラットホームで使われるようになるかもしれません。
Javaの資産は膨大なものがありますので、これをC#から呼び出す方法を試してみようと今回思いました。以前、JNIを使ってC++/CLIからJava(../../../2013021475/)を呼び出すテストをしたことがありますが、これはちょっと面倒なので、もっと簡単な方法はないかと調べたら、いいのがありました。

http://jni4net.com/

bridge between Java and .NET (intraprocess, fast, object oriented, open-source)

Java と.NET相互に呼び出しが簡単にできそうです。今回は.NETからJava呼び出しのみテスト。
しかしあまりあっけなくできてしまったので、もう少し踏み込んで、Clojureの呼び出しをしてみました。
JavaからClojureの呼び出しは、こちら(http://bitlife.me/archives/297)でテストした、プログラムを使い、このJavaプログラム部分を変更して、C#から呼び出します。

環境 : jni4net 0.8.8, Java 1.8.0_25, Visual Studio 2013 Update3 / Windows 8.1
JavaMainCs.java

import clojuresub.core;

public class JavaMainCs{
	public static void sub(String str){
		core.sub(str);
	}
}

Program.cs

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

using net.sf.jni4net;

namespace CSharpMain
{
    class Program
    {
        static void Main(string[] args)
        {
            var bs = new BridgeSetup();

            bs.AddClassPath(@"C:\wk\", true);
            bs.AddAllJarsClassPath(@"C:\wk\");

            Bridge.CreateJVM(bs);

            java.lang.Class jclass = 
                java.lang.ClassLoader.getSystemClassLoader().loadClass("JavaMainCs");

            java.lang.Class[] cls = { java.lang.String._class };
            java.lang.Object[] obj = { new java.lang.String("C# String") };

            java.lang.reflect.Method method = jclass.getMethod("sub", cls);
            method.invoke(null, obj);

            Console.ReadKey();
        }
    }
}

C#のコードの中にJavaが書けてしまい、ちょっと不思議な感覚になります。

VisualStudioでは参照追加とビルド設定をします。
clojure_cs01

以下のようにファイルを配置して実行しました。(JavaMain.classは前のテストのものなので不要)
clojure_cs02

最近、Lispを再勉強中ということもあって、Java環境ではClojureを使っていましたが、この記事を書きながらいろいろと調べていたら、WindowsにはIronSchemeというものがあることを知りました。次回、これをとりあげてみたいと思います。

]]>
../../../20141206942/feed/ 0