「展開した結果に...を含める」には (... ...) と書くことにR6RSではなっています。
R6RS と聞いて思い浮かんだのは、IronScheme, mosh, Ypsilon でした。
取りあえず今回は、すでにインストール済みの IronScheme で試してみました。
どうやら意図通り動いたようです。
追記
IronScheme は Emacs インターフェースもあったりします。以前少し試したことが・・・。
「展開した結果に...を含める」には (... ...) と書くことにR6RSではなっています。
とりあえずGauche(Scheme)だとこうでしょうか?
(fold (lambda (n r) |
それともこう?
(apply + (iota 10 1)) |
IronScheme
IronSchemeでも同じようにいけますね。IronSchemeもSRFIをフルサポートしているらしい。RSR6も数千の項目に対してサポートしていないのは残りわずか数個らしい。
(import
(iota 10 1 2)
(apply + (iota 10 1))
(fold (lambda (n r) |
再帰も厳密に言えばループじゃないよね!ということで・・・
(((lambda (f) |
これはつまり
(((lambda (f) |
というようなことで、乱暴に言うと
((lambda (f n r) |
と似たような意味で結局は
(define f |
Visual Studio 2008 でIronScheme を書けると聞いて。シンタックスハイライトと若干の入力補完もあると聞いて。設定失敗。あきらめた。また今度。
/IronScheme/docs/visual-studio.txt
- Run from the command line: |
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
サービス: LanguageServiceSUCCEEDED: 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 OKNow 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.
これ読んで、こういう感じかな・・・と。
でも動かない。何かが足りないか間違ってるか・・・。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)
(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))))
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:
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は確か、プラグイン非対応だったよな・・・。オレ涙目。
参考にしたのはこちら
参考というよりは写経ですが・・・
おー、フォームが表示されました!
コードはこちら。
(import (rnrs) (ironscheme clr))
(clr-reference System.Windows.Forms)
(define (make-form) (clr-new form))
(define (form-show form) (clr-call form show form))
(define (application-run form)
(define (form-click-add! form proc)
(define (application-exit)
(define (main)
(main) |
コードの方を追いかけてみます。
(import (rnrs) (ironscheme clr)) |
モジュール(?)をインポートしてますね。ここの意味が未だによくわからない。
(clr-reference 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での開発の仕方や名前空間や各手続き、定義済みの手続きなどの一覧が見たいのですが・・・・・
(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なんかの手続きも普通に定義済みなんですねー。
Hello, world
> (import |
出力
Hello, world |
取り合えず、.NET Frameworkの静的なメソッドを呼ぶのは「clr-static-call 」手続きみたいですね。
(clr-static-call System.Console WriteLine "Hello, world") |
「D:\\」のディレクトリ名一覧取得。
> (import |
出力
#(D:\Capitals D:\MSOCache D:\Protected D:\Public D:\RECYCLER D:\Shortcuts D:\System Volume Information D:\Writings)> |
なんだろう、名前空間ではなさそうな「何か」をインポートしてますね。
> (import |
よくわからない・・・。
C#の「using System.IO」みたいなもんかね。
参考: