Curlでリッチプログラミング このページをアンテナに追加 RSSフィード

2008-08-17

[]プログラミング言語Curl 00:51

curlは one of RIAs としてしかほとんど知られていませんが、純粋にプログラミング言語としてもcurlは大変面白いです。このブログのタイトルもそうした思いからついています。

kwatchの日記というブログで、珍しくプログラミング言語としてcurlが取り上げられていました。Javaは近代、Rubyは現代で、Curlは未来の言語だそうです^^;


kwatchの日記 - Java は近代の言語、Ruby は現代の言語、Curl は未来の言語

タイトルは釣りでもなんでもなくて、大まじめ。

Curl というのは、MIT の人たちが作ったリッチクライアント用言語。もともと軍隊で兵士につけるデバイス用のアプリを作るために開発されたらしい。だから少ないリソースでも高速に動作し、バカでも分かるGUIを備え、ネットワークが繋がっていてもいなくても同じように動くよう設計されたんだとさ。

リッチクライアント製品としての Curl も面白いんだけど、プログラミング言語としての Curl はもっと面白い。まじで次世代の言語だと思う。

以下、その理由。

こうやって特徴を列挙されるとcurlはもっとプログラミング言語としてアピールしてもいいんじゃないかと改めて思う。それにしてもこの人詳しいなぁ。。curlの特徴的なところはほとんど押さえられてる。マクロに言及がないのが意外だけど目に止まってないだけでしょうか。独自構文を定義できるマクロcurlの中でも特に強力な機能なのでぜひこういった人には評価してみてもらいたい。

このブログ中のコメントについて少しフォロー。

ただし、C# の var のような、初期値で型を決定するという機能はない。ここは残念。

定数限定ですがdef構文を使うと型推論します。(def構文でよりlightweightになるプログラミング

なので匿名プロシージャは

|| これはめんどくさい
{let comp:{proc-type {String, String}:bool} =
    {proc {s1:String, s2:String}:bool
        {return s1.size < s2.size}
    }
}

の代わりに

{def comp =
    {proc {s1:String, s2:String}:bool
        {return s1.size < s2.size}
    }
}

のように宣言できます。

ちなみに匿名プロシージャはfnマクロを使って定義する方法もあります。代入先の型をコンパイラが知ることができる場合に、fnマクロを使うと匿名プロシージャの定義自体から型の指定が省略可能になります。例えばArray-of.sortメソッドの比較関数であれば↓のような感じ。

{array.sort
    comparison-proc =
        {fn s1, s2 => s1.size < s2.size}
}

2008-03-26

[][]Curlプラットフォームの7つのナイスなこと 01:58

Developer Communityブログのmgordonによるポストの翻訳です。

Developer Community Blog: Seven nice Things about the Curl Platform

What makes Curl such a great programming platform? Here are seven things.


Curlプログラミングプラットフォームとしてどこがそんなに優れているのでしょうか?ここに7つの理由をあげます。


単一プラットフォーム: Curl RTEはあらゆるプラットフォームのどんなブラウザでも同じように動作します。ブラウザ毎の気まぐれな動きやバグに対処する必要はありません。

セキュリティ: Curlセキュリティモデルは、非特権アプレットがユーザのコンピュータ上で無制限に動作をすることを防ぎます。安全性を考慮すると、私たちはほとんどのアプレットが非特権であるべきだと考えます。ファイルの読み込み/書き込みなど、一般的に必要とされるが安全でない可能性のある操作については、それを行う前にRTEによってユーザに許可が求められます。これは、常に許可したり、逆に常に禁止したりするよりもよい方法です。アプレットに完全な特権を与えることも当然可能ですが、これは気軽に採用すべき手段ではありません。

スピート: アプレットCurl RTEによってマシンコードにコンパイルされるため、実行速度は速いです。アプレットWebサイトからダウンロードされると、インクリメンタルにコンパイル、評価されます。出力を生成する式はすぐにWebブラウザに表示されます。クラス定義やプロシージャ、パッケージなどは、コンパイル後にキャッシュされるため、その後のダウンロードが初回よりも高速になります。

ソフトウェア工学: Curlソフトウェア工学に真剣な方にも好まれる言語です。変数を"any"型として宣言できる一方で、強い型チェックが行われます。多重継承をサポートし、パラメータ化タイプ(genericクラス)、さらにはユーザ定義マクロを備えます。全てをクラスにする必要はありません。豊富なAPIが利用可能で、コンパイル時の型チェックがエラーの早期除去に役立つため、開発も円滑です。加えて、デバッグ時には一切"ビルド"を行う必要はありません。編集してブラウザをリロードするだけです。

単一言語: Curl言語は現代的なWebアプリケーションの全てに適しています。 クラス、アルゴリズム、データ、式、イベントとハンドラ、テキスト、グラフィックス、フォーム、テーブル、およびその他全てを同じ言語で表現できます。XMLJavaScriptHTMLActionScript、その他様々な言語やフォーマットの煩雑な組み合わせを駆使する必要はありません。

サーバ配備: Curlアプレットの配布は、単にそれをWebサーバに置くだけです。Webサーバ上のファイルを更新すればアップデートされます。静的なWebサイトを更新するのと同じくらい簡単です。

サービス指向: CurlアプレットWebサービスとWeb APIの理想的なコンシューマです。あらゆるSOAPエンドポイントをCurlパッケージに変換して直接呼び出すことができます。REST APIの扱いも容易です。同期/非同期両方のリクエストをサポートします。


私たちは今後数週間にわたって、これらの内容やCurlプラットフォームのその他の利点についてさらに説明をしていきます。どれが特に興味深かったかをぜひ私たちに教えてください。

Webデベロッパの方は、フリーのIDEをダウンロード(必要であればRTEもインストールされます)してCurlを試してみてください。Webに配備する予定がなかったとしても、あらゆるプログラミングプロジェクトでCurlを使うことができます。どんな種類の計算やユーザインタラクションも、Curlによって簡単になります。入門用の開発者ガイドにはたくさんの例が載っています。

2007-12-23

[]def構文でよりlightweightになるプログラミング 03:01

今回は6.0で追加された def 構文を紹介します。

6.0の数ある新機能の中では地味な部類に入るかもしれませんが、プログラマ的(個人的)には最も注目に値する新仕様です。


defは定数を宣言するときに使います。

従来でも定数は let constant で宣言することができましたが、def構文の新しい(素晴らしい)ところは定数の型宣言を省略できることです。つまり今まで、

let constant cb:CommandButton = {CommandButton}
let constant s:String = "foo"

と書いていたところを

def cb = {CommandButton}
def s = "foo"

のように書けるようになります。

実は curl は動的型付けのプログラミングスタイルもサポートしているので、let 文でも型宣言は従来から省略が可能でした。

let cb = {CommandButton}
let s = "foo"

しかし上記のように let で型宣言を省略した場合、変数は any 型として扱われ、コンパイラによる型チェックが行われません。一方、def で宣言した定数には初期値(右辺の式)のコンパイル時型が割り当てられます。静的型付けの恩恵を受けつつ型宣言を省略でき、プログラミングがとてもお手軽になった印象です。


def で宣言できるのは定数だけなので使えるケースは限られるように思われるかもしれませんが、しばらく6.0でプログラミングをしてみて思った感想は「意外に多用する」というものです。これまでは、いかに constant の記述を怠って変数ばっかり使っていたのか思い知らされました。(汗

def のおかげでコードの記述量が削減されただけでなく、必要がない限り let を使わなくなるため、意図しない変数の上書きを予防できるようにもなって一石二鳥な面もありました。


最後に、def を使うともっとも効果的なケースを紹介します。それは、匿名プロシージャ*1変数で受けるケースです。

curlはプロシージャの型を、引数の種類*2と型、戻り値の型の組み合わせで区別するため、非常に厳格な型チェックを行ってくれる反面、型の記述が煩わしいという問題がありました。例えば、String型の位置引数をふたつ取り、bool型の戻り値を持つプロシージャの型は

{proc-type {String, String}:bool}

と書きます。

curlのヘルプドキュメントでも、この記法の複雑さを自覚してか、型宣言を省略して any 型の変数で受けちゃうのもアリだよ的な説明が載っていますが*3、定数でよいのであれば def 構文を使用するに限ります。

def p =
    {proc {s1:String, s2:String}:bool
        || snip
    }
{type-of p} == {proc-type {String, String}:bool} || ==> true

ちゃんとプロシージャ型も正しく割り当てられます。

*1curlではクロージャをこう呼びます

*2:位置引数、キーワード引数、残余引数

*3Curl開発者ガイド > 基本概念 - 構文 > プロシージャと引数 > 匿名プロシージャ > 匿名プロシージャでの any データ型の使用

2007-12-02

[]Curlのスコープ 03:01

ここでいきなり問題。以下のコードは何をalertするでしょうか?

(function(){
  var i = -1;
  for(var i = 0; i < 10; i++){
    /* whatever */
  }
  alert(i);
})()

これが-1でないのは、Perl Mongerにはびっくりです。

たぶんCurlerにもびっくり?

Curlだったら当然-1ですね。

{value
   let i = -1
   {for i = 0 below 10 do
   }
   i || -1
}

実行可能サンプルはこちら↓(※curlランタイムが必要)


別にdankogaiのページにトラックバックしたかっただけとか、前回作ったばっかのGoogleガジェット使いたかっただけのブログでは決してありません。

それにしてもcurlもシンタックスハイライト対応してほしいなぁ。。こういうのどこに頼めばいいんだろう。

2007-11-11

[][]Javaプログラマのための5つのCurl基本構文 02:57

今回はCurlプログラムの基本的な構文のうち、Javaと比べて比較的特徴的なシンタックスの構文を5つ紹介します。JavaプログラマでこれからCurlを覚えようという方は、まずこれを読んでからCurlの学習を始めてください!


1. Hello, world!

いきなり最初に構文じゃないところから始めてしまいますが、まずはHello, world!の書き方。

まずはJavaから

public class Hello {
	public static void main(String[] args) {
		System.out.println("Hello, world!");
	}
}

標準出力に文字列の"Hello, world!"を出力します。

次にCurlCurlは標準出力ではなくブラウザに表示する例にします。

{curl 5.0 applet}
Hello, world!

最初の {curl 5.0 applet} はアプレットの先頭に必ず必要になる宣言*1で、Hello, world! はその直後にそのまま記述します。Curlアプレットのトップレベルに記述されたテキストはそのまま表示されます。


2. コメント

CurlJavaと同様に行末コメントとブロックコメントを記述するための構文があります。

// Javaの行末コメント
/* Javaのブロックコメント */
|| Curlの行末コメント
|# Curlのブロックコメント #|

Curlはこの他にも「タグ付きコメント」や「長さ指定コメント」という記法があります(が、あまり使わないかも。興味のある方はIDEのヘルプをご覧ください*2)。


3. 変数宣言

Javaは「データ型 変数[ = 初期値];」という構文で変数を宣言します。

int i = 5;
String s = "あいうえお";

Curlでは let という文を使います。

let i:int = 5
let s:String = "あいうえお"

書式は「let 変数:データ型[ = 初期値]」です。


4. 代入

次は代入文です。Javaは = 演算子を使うだけですね。

i = 10;
s = "かきくけこ";

Curlでは set という分を使います。

set i = 10
set s = "かきくけこ"

5. メソッド呼び出し

最後はメソッド呼び出しの構文です。

Javaは () を使いますね。お馴染みの記法だと思います。

obj.doMethod(param1, param2);

CurlJavaと同様、オブジェクトのメンバ(フィールドやメソッド)は「object.member」でアクセスします。ただしメソッド呼び出しに使用する括弧の種類と位置が違います。

{obj.do-method param1, param2}

Curlでは、Curlの名前の由来ともなっている {} (curly brackets)を使います。開始括弧の位置にも注意してください。

構文を対比すると、

(Java)オブジェクト名.メソッド名(引数1, 引数2, …);

(Curl){オブジェクト名.メソッド名 引数1, 引数2, …}

Curlは {} を頻繁に使用するため、慣れないうちはよく {} の使い方に混乱する場合がありますが、基本は上記の通りです。


以上、Javaの文法を知っている方がCurlを覚える場合に最初に押さえておくといいと思われる基本構文の違いを5つ紹介してみました。

ちなみにRIA Knowledge Centerというサイトで「Learning Curl By Way of Java」というドキュメントが公開されています。

実行環境やコンパイラの動作の違いなどを含めた、一歩進んだ話題を扱っています。Curlをより深く理解したい方はぜひご覧になってみてください。

*1:「Curlヘラルド」と呼びます。IDEを使っていれば自動的に挿入されます。

*2:Surge Lab 開発者ガイド > 基本概念 - 構文 > 基本的な構文 > コメント