2010-11-21 16 views
9

スコープが囲まれた関数に拡張されないような方法で言語が定義されている言語はありますか?換言すれば、以下の(Pythonのような構文)のようなコード言語がある:Xは関数fact内部で定義されていないためグローバル変数のないプログラミング言語はありますか?

>>> x = 3 
>>> def fact(n): 
...  print x 
...  return reduce(lambda u, v: u*v, xrange(1, n+1), 1) 
...  

はエラーを与えるだろうか?

一般に、の範囲には、の機能に定義されている機能が含まれていない言語がありますか?

を編集してください:有益なコメントありがとうございます。問題なので

:私はこのことについて考えた理由は、それを含む機能が提供するすべての環境へのアクセスを有する内部機能の状況は彼のargument against OOPにジョー・アームストロングで説明した状況に私に怪しい近くに聞こえるということです オブジェクト指向の言語では、 が暗黙環境のすべてを持っています。 彼らはそれらを持ち歩いています。あなたは バナナを欲しがっていましたが、バナナを持っている ゴリラとジャングル全体 でした。

Newspeakにはグローバルネームスペースがありませんが、どのように動作するのかわかりません。

PythonspeakまたはSystemの多くの言語で__builtins__からインポートされた組み込み関数の問題を、以下のブライアンのコメントでは、すべての関数のインタプリタ/コンパイラによって人工的に導入することができます。結局のところ、彼らはほとんど常に最初の場所で特別に扱われます。もう1つの選択肢は、それらを関数のパラメーターとして渡されるオブジェクトのメソッドとして持つこと、または内部からモジュールとしてインポートすることです。

+1

これは何ですか? – Blindy

+4

'print'、' reduce'、 'xrange'もいくつかの外側スコープから解決される識別子のように見えます。なぜこれがめったに役に立たないのかを示しています。 – Brian

答えて

8

私は、Newspeakでどのように動作するか概説しようとします。

あなたが書いたコードは、モジュールである必要があります。 Moduleは一種のクラスです.Newspeakクラスには他のクラスを含めることができるため、Moduleは基本的にトップレベルのクラスです。つまり、別のクラスには含まれていません。 Newspeakの特別な点は、あなたのモジュールの外には何も参照できないということです。

だから、どのようにNewspeakのコンソールに印刷しますか?印刷は、Platformモジュールの一部であるConsoleクラス(a.k.a. Smalltalkのトランスクリプト)に属します。コンソールに印刷できるようにするには、モジュールはPlatformコンストラクタパラメータを取得し、プラットフォームからコンソールを取得し、スロットにコンソールを格納してから印刷するために使用します。

基本的には言語レベルで適用依存性の注入のようなものです。言語IDEとランタイムは、プログラムのパッケージ化とブートストラップに役立ちますが、詳細は - Gilad Bracha's blogthis postなどを参照するか、Newspeak Modules paperを参照してください。

P.S. Newspeakは実用的でも実用的でもなく、業界環境で使用されており、現在では(しかし、成長している)小さなオープンソースコミュニティを持っています。 Newspeakは非常に新しく進化していますが、個人的な経験からは、プログラムを書くのは非常に簡単で楽しいです。

+0

これは、グローバルな状態がなくてもコンソールクラスがグローバルな状態であるということではなく、ユーザーではなくコンパイラによって管理されているだけです。 – Puppy

+0

コンソールクラスはプラットフォームモジュールの一部です。最初にPlatformインスタンスを取得する必要はありません。クラスそのものはモジュールのプロパティですが、Vassili Bykovの一連の投稿はかなり良い説明です:http://blog.3plus4.org/2008/12/04/a-taste-of-nested-classes-part -1/ – Yardena

+0

私は、引数が "言語に存在しない"という定義に沸き起こると思います。 IMHOプログラミング言語のコンパイラとランタイムが特定の概念をプログラマーに公開しない場合、 "概念は言語には存在しない"、例えば、 Javaはメモリ配分やgotoのない言語ですが、明らかにフードの下で実行されます。 – Yardena

-5

現実的には、このようなことは決して存在しません。検討してください - コンソールに印刷するとき、そのコンソールハンドルはどこから来ていますか?あなたが関数を参照するとき、その関数はどこから来ましたか?あなたが呼び出す関数のスタックには、実際には存在しません。そうです、それはグローバルです。現実には、グローバルがなければ、スタックやヒープに直接にはないものを決して参照することはできません。つまり、DEPのおかげで機械命令はありません。ヒープの場合は、どこからヒープを取得しますか?実際に新しいメモリを割り当てるためにOS関数を呼び出すことはできません。これはグローバルです。

理論的には、あなたはそのような言語やプログラムを作成することができますが、実際にはBrainfuckに似ています。

+3

私が質問したところでは、Newspeakはそれを正確に実行すると主張しています(グローバルな名前空間なしで作業)。 –

+0

@ムハンマド:私はウィキペディアの記事を読んでいて、私にとってはそれほどグローバルではないとは言えません。それはまた、非現実的で、使用できないと思われます。 – Puppy

+4

@DeadMG:非現実的で使用不可能なのは、見る人の目にある。それは新しいものであり、興味をそそるSmalltalkの派生品です。それにもかかわらず、概念は通常メッセージの受け渡しに依存するので、別の例を挙げます:メッセージである多数の並列プロセスからなるErlang並行プログラムを仮定します。異なるプロセッサ間で。グローバル/共有環境は何ですか?そのためには、何も共有していないメッセージングシステムを利用してください。 –

0

グローバルスコープが、例えば連想配列オブジェクトを含む関数とオブジェクトは、呼び出されるすべての関数に作業環境として渡されます。

次の例を考えます。通常のPythonプログラムで、あなたがこのような何か書くとすると:なしグローバルでプログラムに

import foo 

def square(x): 
    return x*x 

print(square(int(raw_input("give a number: ")))) 

をするのではなく、このような何か書くでしょう:

def main(environment): 
    environment['import']('foo') 
    environment['square'] = lambda x: x*x 
    environment['print'](environment['square'](int(environment['raw_input']("give a number:")))) 

をして、このコードは、コンテキスト内で実行されるだろう

この種のアプローチとグローバルを持たないプログラムでは、プログラム内の関数はex彼らが得た議論を通して彼らが何を得ることができるかを説得する。関数の代替環境を作成し、それを "jails"で実行することもできます。ライブラリと関数は、必要な回路の電子部品と似ていますが、必要な部分に接続することもできます。このパターンを念頭に置いて設計されたプログラミング言語は、暗黙的な "デフォルト"環境を自動的に関数呼び出しに渡すための構文上の砂糖があるかもしれませんが、いつでも明示的に使用することができます。

たとえば、オペレーティングシステムのファイルシステムまたはネットワーク内のデータにアクセスするように設計されたライブラリがあれば、代替環境を提供し、I/Oを監視したり、ライブラリを作成したりすることができます通常のファイルシステムとネットワークの代わりに、独自の仮想ファイルシステムまたはVPN接続を使用します。

関連する問題