2009-09-01 7 views
14

私の日常的な仕事の間、私はJSON結果を照会するためにLINQ式のようなものである連鎖したjavascript関数を書いていました。Javascriptではメタプログラミングが可能ですか?

var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status"); 

これは完全に機能し、予期した結果が得られます。

私は、コードが

var Result = from obj1 as x where x.status 
groupby x.status having count(x.status) > 5 
select x.status; 

は、これを達成する方法があります(より読みやすい形で)このように書かれている場合、これは素晴らしい見え思っていました?

乾杯

ラメシュ・ヴェル

+4

\ *咳\ * http://www.hugoware.net/Projects/jLinq\ *咳\ * –

+0

あなたのコードをいくつかのHTMLタグまたはテキストファイルに入れることができます。その後、あなたはJavascriptを使って自分のDSLを持つことができます... – Philip

答えて

17

号はJavaScriptがこれをサポートしていません。

しかし、これはあまりにもかなりよさそうだ:あなたはJSONデータを持っている場合

var Result = from(obj1) 
      .as("x") 
      .where("x.id=5") 
      .groupby("x.status") 
      .having(count("x.status") > 5) 
      .select("x.status"); 
5

なく、かなりあなたが欲しいもの、JavaScriptでパーサを書き、そしてちょうど(文字列として保存された)クエリを解析し、それを実行することは可能であるが。例えば、http://jscc.jmksf.com/のようなライブラリを使用して(間違いなくそこに他のものがあります)、実装するのは難しいはずはありません。

しかし、あなたが質問で持っているものは既に素晴らしいと思われますが、私はあなたがそれをあなたが示唆した方法で見たいと思っているのか分かりません。

+0

返信Chii ..ありがとうございました。実際には、私はさまざまな可能性を実験していました。私はC#の背景、recentltyはjavascriptで始まって、ちょうどJSの機能を探求したいと思っている... thatsの理由..そして、リンクのおかげで..私はすでにあなたが言及したようなJSのパーサーを見ている..私はhttp://www.codeplex.com/jsinqが有用であることが判明しました..再び感謝.. – RameshVel

1

ワットあなたがしたいのは、JavaScriptパーザをSQLパーサに変更することです。これを行うために作成されたものではなく、javascriptの構文では許可されていません。

あなたが持っているものは、SQL(それにまっすぐ写っています)と90%、100%有効なjavascriptです。これは素晴らしい業績です。タイトルの質問に対する私の答えは:はい、メタプログラミングが可能ですが、いいえ、それはJavaScriptの文法を使用するためにバインドされているので、それはあなたにSQLパーサを与えません。

6

ほとんどの人は、の中からの好きな言語をメタプログラムしようとしています。言語がメタプログラミングをうまくサポートしないなら、それはうまくいかない。他の答えでは、JavaScriptはそうではないことがわかりました。

を使用して、の外側のの言語からメタプログラミングを行う方法です。そのようなツールは、ソースコードを解析し、それに任意の変換を実行することができます(これはメタプログラミングがとにかく行うことです)。そして、改訂されたプログラムを吐き出します。

任意の言語を解析できる汎用プログラム変換システムをお持ちの場合は、好きな言語でメタプログラミングを行うことができます。 C、C++、Java、C#、COBOL、PHP、ECMAScriptなどのプログラミング言語の堅牢なフロントエンドを備え、これらすべてのメタプログラミングに使用されているツールについてはDMS Software Reengineering Toolkitを参照してください。

あなたのケースでは、SQLクエリの新しい構文でJavaScript文法を拡張し、それらをプレーンJavaScriptに変換する必要があります。 (これは意図的プログラミングのようなものです) DMSは、追加のルールでJavaScript方言を簡単に構築できるようにします。そして、そのプログラム変換機能を使用して同等の標準Javascriptを生成することができます。

私は、「惑星上のすべてのプログラマーのためのカスタム構文」の素晴らしいファンではないと言いました。これは、意図的プログラミングがIMHOをリードするところです。

これは、この貴重なものを見つける大きなユーザーコミュニティがある場合には、これは良いことです。このアイデアは、その一つかもしれないし、そうでないかもしれない。問題の一部は、実験をせずに見つけ出すことができず、問題に十分な社会的牽引力を得ることができない場合があります。

3

はまあ、あなたのコードサンプルで:

var Result = from(obj1) 
      .as("x") 
      .where("x.id=5") 
      .groupby("x.status") 
      .having(count("x.status") > 5) 
      .select("x.status"); 

(識別子として使用select以外の)私が見る唯一の問題は、あなたが関数の引数として述語を埋め込むことです。

  .having(function(x){ return x.status > 5; }) 

JavaScriptはクロージャーとダイナミックなタイピングを備えているので、実際には上品で上品なことができます。ちょうどあなたに知らせる。

+0

ジョーイ、ありがとうございました.. :) – RameshVel

2

純粋なJSでは、あなたはできません。しかし、正しいプリプロセッサでは可能です。

sweet.jsマクロまたは(神が許してくれます)GPPと似たようなことができます。

1

この質問が数年前に尋ねられたことを考慮して、私は現在の技術に基づいてこれをさらに追加しようとします。

ECMAScript 6以降、ある意味ではSymbol,ReflectおよびProxyオブジェクトを介してメタプログラミングがサポートされています。シンボルは、オブジェクトの内部を追加することができ、新たなプリミティブで、要するに

Metaprogramming in ES6: Symbols and why they're awesome

:ウェブ上で検索することにより

は、私はキースKirkelによって書かれたテーマに関する非常に興味深い一連の記事を見つけました(実際にはプロパティなしで)、メタプログラミングのプロパティを渡すために非常に便利です。シンボルは、既存のクラスの動作を変更することによって(実装内のリフレクション)、すべての動作を変更することです。要するに

Metaprogramming in ES6: Part 2 - Reflect

、効果的に今1つの、便利なオブジェクトで公開JavaScriptエンジンの内部から独占的に利用できたものを「内部メソッド」の全てのコレクション、である反映します。その使用法は、JavaとC#のReflection機能に似ています。これらは、コードに関する非常に低いレベルの情報(イントロスペクションによるリフレクション)を検出するために使用されます。要するに

Metaprogramming in ES6: Part 3 - Proxies

、プロキシは、オブジェクトをラップし、トラップ(執り成しによる反射)を介して自分の行動を傍受する責任ハンドラオブジェクトです。

もちろん、これらのオブジェクトは、メタプログラミング言語と比較してはるかに制限的である特定のメタプログラミング機能を提供しますが、実際には主に反射慣行を通じて基本的なメタプログラミングの便利な方法を提供できます。

最後に、JavaScriptで段階的メタプログラミングに役立つことがあることを言及する価値があります。ongoing research work

関連する問題