ラベル IronScheme の投稿を表示しています。 すべての投稿を表示
ラベル IronScheme の投稿を表示しています。 すべての投稿を表示

2010/05/27

Re: Re: syntax-rules: reverse-and-quote-list @ IronScheme

「展開した結果に...を含める」には (... ...) と書くことにR6RSではなっています。

R6RS と聞いて思い浮かんだのは、IronScheme, mosh, Ypsilon でした。
取りあえず今回は、すでにインストール済みの IronScheme で試してみました。




どうやら意図通り動いたようです。

追記

IronScheme は Emacs インターフェースもあったりします。
以前少し試したことが・・・。

Programming C# 4.0

2009/10/02

流行っていると聞いて - ループを使わずに1から10までの総和を表示するプログラム

 

WS000020

ループを使わずに1から10までの総和を表示するプログラム

 

とりあえずGauche(Scheme)だとこうでしょうか?

(fold (lambda (n r)
        (+ n r))
      0
      (iota 10 1))

 

それともこう?

(apply + (iota 10 1))

 

 

IronScheme

WS000019 

IronSchemeでも同じようにいけますね。IronSchemeもSRFIをフルサポートしているらしい。RSR6も数千の項目に対してサポートしていないのは残りわずか数個らしい。

(import
(rnrs)
(srfi lists)) ; srfi-1

 

(iota 10 1 2)
;; -> (1 3 5 7 9 11 13 15 17 19)

 

(apply + (iota 10 1))
;; -> 55

 

(fold (lambda (n r)
        (+ n r))
      0
      (iota 10 1))
;; -> 55

 

再帰も厳密に言えばループじゃないよね!ということで・・・

(((lambda (f)
   (f f))
(lambda (f)
   (lambda (n r)
     (if (<= n 10)
         ((f f)(+ n 1)(+ n r))
         r)))) 1 0)
;; -> 55

これはつまり

(((lambda (f)
    (lambda (n r)
      (if (<= n 10)
          ((f f)(+ n 1)(+ n r))
          r)))
  (lambda (f)
    (lambda (n r)
      (if (<= n 10)
          ((f f)(+ n 1)(+ n r))
          r))))
  1 0)

というようなことで、乱暴に言うと

((lambda (f n r)
   (if (<= n 10)
       (f f (+ n 1)(+ n r))
       r))
(lambda (f n r)
   (if (<= n 10)
       (f f (+ n 1)(+ n r))
       r))
1 0)

と似たような意味で結局は

(define f
  (lambda (f n r)
   (if (<= n 10)
       (f f (+ n 1)(+ n r))
       r)))
(f f 1 0)
;; -> 55

みたいなものということで

2009/09/10

IronSchemeとVisual Studio 2008

codeplex-logo WS000016 WS000017

 

Visual Studio 2008 でIronScheme を書けると聞いて。シンタックスハイライトと若干の入力補完もあると聞いて。設定失敗。あきらめた。また今度。

 

 

/IronScheme/docs/visual-studio.txt

- Run from the command line:
  * If admin: RegPkg /codebase <absolute path of IronScheme.VisualStudio.dll>
  * If not admin: RegPkg /ranu /codebase <absolute path of IronScheme.VisualStudio.dll>
  * devenv /setup

 

cmd

C:\Program Files\IronScheme>regpkg "c:\program files\ironscheme\ironscheme.visualstudio.dll"

 

Registering   : IronScheme.VisualStudio 1.0.0.0
Registry Root : Software\Microsoft\VisualStudio\9.0
---------------------------------------------------
インストールされている製品:   IVsInstalledProduct インターフェイスを使用
パッケージ:          Package {0bc23fca-38ba-4cc2-9c39-1ed1c46172cb}
言語拡張: .sls、{4bfaea21-b66a-458b-bc32-24457c9178b7}
言語拡張: .sps、{4bfaea21-b66a-458b-bc32-24457c9178b7}
言語拡張: .ss、{4bfaea21-b66a-458b-bc32-24457c9178b7}
言語サービス: IronScheme、{4bfaea21-b66a-458b-bc32-24457c9178b7}
LoadKey:          IronScheme IronScheme.VisualStudio
バージョン 1.0.0.0
必要なエディション: Standard
サービス:          LanguageService

SUCCEEDED:        IronScheme.VisualStudio

 

 

IronScheme Visual Studio 2008 Integration

A quick and dirty way to get your scripts to execute from within visual studio:
1) Click on the Tools Menu and choose "External Tools"
2) Click "Add" and enter a Name (I chose IronSc&heme, the ampersand denotes which character you can use as a shortcut)
3) Click the "..." next to Command and browse to where you installed IronScheme.Console.exe, select it and click "Open"
4) In the Arguments box, enter $(ItemPath) (you can choose other macros from the arrow button list to the right)
5) In the Initial Directory box, enter $(ItemDir) (again, you can choose other macros from the list to the right)
6) Uncheck close on exit
7) Click OK

Now you will be able to run the IronScheme console with your current file as input by selecting the menu item, or by hitting alt+T then H.
It's not a REPL, but it's pretty good for running stuff. Also, if you use ViEmu or other visual studio plugins, you will have access to them.

これ読んで、こういう感じかな・・・と。

WS000018

 

でも動かない。何かが足りないか間違ってるか・・・。Emacsで書けるのでこれ以上追う気になれない。また今度。

IronScheme in Emacs

WS000016

Scheme 処理系には IronScheme という選択肢もあります。R6RS にほぼ準拠していて SRFI も .NET Framework も使えます。.NET に慣れ親しんだプログラマが Scheme を始めるにあたっては良い選択肢の一つかも知れません。ちなみに C# で実装されており、ソースも読むことができます。
コンソールの REPL だけでなく、Visual Studio 2008 で開発を行なうためのアドインや Emacs で開発を行なうためのインターフェースもあります。Visual Studio 2008 のアドインではシンタックスハイライトやインデント、入力補間などがサポートされているようです。

取りあえず Emacs で IronScheme が使えるようにしてみました。
WS000017

以下の設定を .emacs に追加しました。
(defun iron-scheme-other-window ()
  "Run IronScheme on other window"
  (interactive)
  (setq scheme-program-name "\"C:\\Program Files\\IronScheme\\IronScheme.Console.exe\" -emacs")
  (split-window)
  (let ((buf-name (buffer-name (current-buffer))))
    (scheme-mode)
    (switch-to-buffer-other-window
     (get-buffer-create "*scheme*"))
    (run-scheme scheme-program-name)
    (switch-to-buffer-other-window
     (get-buffer-create buf-name))))

例外がスローされた時などのメッセージが化けるのでこちらも追加。
(modify-coding-system-alist 'process "IronScheme.Console" '(utf-8 . utf-8))

起動ショートカット。
(define-key global-map "\C-c\C-si" 'iron-scheme-other-window)

Gauche での設定を参考に以下のように設定。
(defun scheme-other-window ()
  "Run Gauche on other window"
  (interactive)
  ;; set gosh path
  (setq scheme-program-name "\"C:\\Program Files\\Gauchebox\\Gauche\\bin\\gosh.exe\" -i")
  (split-window)
  (let ((buf-name (buffer-name (current-buffer))))
    (scheme-mode)
    (switch-to-buffer-other-window
     (get-buffer-create "*scheme*"))
    (run-scheme scheme-program-name)
    (switch-to-buffer-other-window
     (get-buffer-create buf-name))))

Dynamic Language Runtime

2009/05/13

[scheme][win]Scheme開発環境まとめ

Scheme 処理系のいろいろ。

本命

やはり本命は Emacs ですね。GaucheBox だとインストーラーで簡単に環境が整備されます。Emacsを使ったことが無いとキーバインドに慣れるまでに時間がかかるかもしれません。
評価、実行、S式間の移動などが素早く行えます。

WS0745

IDE


ステップデバッグが可能です。プログラミング初心者、Scheme 初心者、Emacs が苦手な人、Visual Studio に慣れてる人は Emacs よりこちらの方が良いかもしれません。

WS0778

.NET

.NET。C# で実装されているそうです。
VS2008 にアドインを導入するすることで Visual Studio でも使えるようになるようです。
詳しくはこちら
ironscheme.combination2

JAVA

WS0777

モバイル

pscmppc5

携帯

10120688477_thumb


Schemeによる記号処理入門

2009/05/10

[Scheme][.NET]Visual StudioでIronSchemeを使うには

WS0743

 

Though it says on the IronScheme codeplex site that a plugin is included for visual studio, I have no idea how to get ironscheme working with VS...

Is it possible? If so , how?

Thanks
CodePlexではVisual Studioにプラグインを導入することによりIronSchemeが使えることを示していますが、私にはその方法がわかりません。

それは可能なのでしょうか?そうだとすればどのようにすればよいのでしょうか?

 

Hi

Firstly, you definitely need Visual Studio 2008 SP1, without SP1 it will cause problems.

Secondly, follow the instructions in the visual-studio.txt file.

Run from the command line:

  1. If admin: RegPkg /codebase <absolute path of IronScheme.VisualStudio.dll>

  2. If not admin: RegPkg /ranu /codebase <absolute path of IronScheme.VisualStudio.dll>

  3. devenv /setup

Now start VS, and open a file with a 'ss' or 'sls' or 'scm' extension.

Cheers

leppie

こんにちわ

まず第一にVisual Studio 2008が必要です。SP1でなければ問題が起きます。

第二にVisualStudio.txtの指示に従ってください。

コマンドラインから:

アドミンであれば: RegPkg/codebase
<IronScheme.VisualStudio.dllの絶対パス>

アドミン: RegPkg/ranu/codebase
<IronScheme.VisualStudio.dllの絶対パス>

devenv/setup

Visual Studioを起動してください。
ss、sls、scmを開きます。

 

こんな感じか?適当すぎかしら。

取り合えずVisual Studio 2008のプラグインが必要なんですね。Express Editionは確か、プラグイン非対応だったよな・・・。オレ涙目。

[Scheme][.NET]IronSchemeでForm表示

WS0731

参考にしたのはこちら

参考というよりは写経ですが・・・

おー、フォームが表示されました!

 

コードはこちら。

(import (rnrs) (ironscheme clr))

 

(clr-reference System.Windows.Forms)
(clr-using system.windows.forms)

 

(define (make-form) (clr-new form))

 

(define (form-show form) (clr-call form show form))

 

(define (application-run form)
  (clr-static-call application run (clr-cast form form)))

 

(define (form-click-add! form proc)
  (clr-event-add! form click form proc))

 

(define (application-exit)
  (clr-static-call application exit))

 

(define (main)
  (define f (make-form))
  (form-click-add! f (lambda (s a) (application-exit)))
  (application-run f))

 

(main)

 

 

コードの方を追いかけてみます。

(import (rnrs) (ironscheme clr))

モジュール(?)をインポートしてますね。ここの意味が未だによくわからない。

 

(clr-reference System.Windows.Forms)
(clr-using system.windows.forms)

ここでは恐らく、1行目でSystem.Windows.FormsのDLLを参照しているのかな。2行目で使用する名前空間を宣言しているのだと思われます。C#の「using System.Windows.Forms;」と同じ。

 

(define (make-form) (clr-new form))

ここではSystem.Windows.Forms.Formクラスのインスタンスを生成しているんだろうと思います。

new Form();みたいな。

でもこれはmake-form手続きなわけですから・・・。Formクラスのインスタンスを生成するための手続き、ということでなんとなくFactoryMethod的ですね。

 

追記:

うーん、ここはもしやFormクラスのインスタンスではなくmake-form手続きなどの、手続きがわたってくるのかもしれない。

 

(define (form-show form) (clr-call form show form))

form-show手続き。formを引数にとってますね。きっと先ほどのmake-form手続きで生成されたFormクラスのインスタンスを受け取るのでしょう。

clr-call手続きにform show formの順に引数を与えています。formを2回渡してるのはどんな意味なんでしょうか。formインスタンスのshowメソッドにformインスタンスを渡しているようなことをイメージします。

clr-callはクラスのインスタンスメソッドを呼び出すのかな?確かclr-static-call手続きがクラスのインスタンス静的なメソッドを呼び出す手続きなので恐らくそうなのでしょう。

 

(define (application-run form) (clr-static-call application run (clr-cast form form)))

さてこちらはapplication-run手続きにformインスタンスを渡しているようです。

件のclr-static-call手続きが出てきました。これはクラスの静的なメソッドを呼び出す手続きのようだというお話でした。

applicationクラスのrunという静的なメソッドを呼び出しているのだと思われます。C#では[STAThread] 属性のついたMainメソッドでApplication.Runされますね。IronSchemeでも同じくapplicationクラスの静的なメソッドrunにformクラスのインスタンスを渡しているようですが・・・、clr-castがかまされています。どうみても型変換っぽいです。

C#でいう(Form)form;といったところでしょう。Schemeは動的な型付けなので型宣言とうはありませんが、こういったタイミングで方変換が必要になるのはなぜなのでしょうか。

 

(define (form-click-add! form proc) (clr-event-add! form click form proc))

ここではどうもform-clickイベントを追加しているようですね。C#では+=でデリゲートが追加されるあれですね。

しかし、ここでのclr-event-add!手続きの引数であるform click form procが少し良くわかりません。

formにclickイベントを追加、formにprocを追加・・・ですか。なるほど、formのクリックイベントにproc手続きを関連付けているんですね。clr-event-add!手続きは!がついてるので破壊的なメソッドなんでしょうね。Rubyなんかも!がついてるメソッドは破壊的ですね。イベントを"追加"するわけですから必ず副作用が発生しますよね。

 

(define (application-exit) (clr-static-call application exit))

ここではapplication-exitという手続きを定義していますね。

clr-static-call手続きでapplicationクラスのexitという静的なメソッドを呼び出しているようです。見たまんまアプリケーションの終了ですね。C#などでは明示的にexitなんて書かないと思うんですがどうでしたっけ。もちろんC#でもApplicationクラスにExitというメソッドはあります。(同じ.NET Frameworkだから当たり前ですが)

 

(define (main) (define f (make-form)) (form-click-add! f (lambda (s a) (application-exit))) (application-run f))

ここでようやくmain手続きが定義されています。

make-form(formクラスのインスタンスを生成する手続き)をfという名前に束縛しています。

form-click-add!手続きにformを生成する手続きであるmake-form手続き(f)と無名関数を渡しています。無名関数ではsとa(C#でいうsenderとEventArgs eでしょう)を受け取って(受け取っただけで使わずに)、application-exit手続きを実行しています。つまりフォームをクリックしたらアプリケーションを終了するイベントを追加しています。

最後にapplicattion-run手続きにformインスタンスを生成するmake-form手続きを渡しています。

 

・・・・!?

 

ちょっと待った。fにはmake-form手続きが束縛されています・・・。つまりfは呼び出されるたびにformインスタンスを生成しそうなものです・・・。つまりapplication-runされるformとform-click-add!されるフォームが別のformインスタンスになりそうな気が・・・。

取り合えず置いといて。

 

最後に

(main)

でmain手続きが呼び出されています。

 

うーん。謎が一つ残った。何か勘違いしているかな・・・(?)

ところでIronSchemeの情報はどこに行けば手に入るのでしょうか・・・。IDEでの開発の仕方や名前空間や各手続き、定義済みの手続きなどの一覧が見たいのですが・・・・・

 

 

[Scheme][.NET]IronSchemeでCombination(組み合わせ)


ただ以前書いたコードを実行してみただけですが・・・。

WS0730
(define combination
  (lambda (r l)
    (cond
     ((null? l) '())
     ((or (zero? r)(> r (length l))) '())
     ((= r 1)(map list l))
     ((= r (length l))(list l))
     (else (append (map (lambda (n)(cons (car l) n))
                        (combination (- r 1)(cdr l)))
                   (combination r (cdr l)))))))
append、map、length、zero?、listなんかの手続きも普通に定義済みなんですねー。

Scheme手習い

2009/05/09

[Scheme][.NET]IronScheme触ってます(001)

 

WS0727

Hello, world

> (import
.     (rnrs)
.     (ironscheme clr))
> (clr-static-call System.Console WriteLine "Hello, world")

出力

Hello, world

取り合えず、.NET Frameworkの静的なメソッドを呼ぶのは「clr-static-call 」手続きみたいですね。

(clr-static-call System.Console WriteLine "Hello, world")

 

 

WS0728

「D:\\」のディレクトリ名一覧取得。

> (import
.     (rnrs)
.     (ironscheme files))
> (display
.     (get-directories "D:\\"))

出力

#(D:\Capitals D:\MSOCache D:\Protected D:\Public D:\RECYCLER D:\Shortcuts D:\System Volume Information D:\Writings)>

なんだろう、名前空間ではなさそうな「何か」をインポートしてますね。

> (import
.     (rnrs)
.     (ironscheme files))

よくわからない・・・。

C#の「using System.IO」みたいなもんかね。

 

 

参考:

[Scheme][.NET]取り急ぎIronSchemeのコンソールに何か入力してみる

取り合えず階乗ということで fact 。
WS0720

次に FizzBuzz でも。と、思ったら iota がコケたので取り合えずは15までで FizzBuzz 。さすがにインデント無しで書くのが難しい。。
WS0721

iota がコケた。
WS0722

リストの quote とか display とか。
WS0723


取り合えず触ってみたけど、「何しよう?」と言う状態。コンソールだけでなく IDE での開発もできるっぽいので試してみる。

追記:
  • 改行はできるらしいが、自動インデントはしてくれない
WS0725
WS0726

Parallelプログラミング―in .NET Framework 4.0