[#33732] 文字列の式展開について — Masao Mutoh <mutoh@...>

むとうです。

14 messages 2002/02/03
[#33733] Re: 文字列の式展開について — Tietew <tietew-ml-ruby-list@...> 2002/02/03

[#33745] Re: 文字列の式展開について — Masao Mutoh <mutoh@...> 2002/02/04

むとうです。

[#33746] Re: 文字列の式展開について — Take_tk <ggb03124@...> 2002/02/04

たけ(tk)です。

[#33762] WebDAV client — HIDAKA Takahiro <cv8t-hdk@...>

 ひだかです。

15 messages 2002/02/05

[#33793] 右辺の値なしでも実行可能? — "井上 浩一" <kyoui32@...>

井上です。

48 messages 2002/02/08
[#33794] Re: 右辺の値なしでも実行可能? — Tietew <tietew-ml-ruby-list@...> 2002/02/08

[#33797] 変数の宣言 — Yasuhiro Hayase <hayase@...> 2002/02/08

早瀬@大阪大学基礎工学部情報科学科 です。

[#33798] Re: 変数の宣言 — matz@... (Yukihiro Matsumoto) 2002/02/08

まつもと ゆきひろです

[#33839] Re: 変数の宣言 — Yasuhiro Hayase <hayase@...> 2002/02/11

早瀬@阪大です。

[#33840] Re: 変数の宣言 — Tanaka Akira <akr@...17n.org> 2002/02/11

In article <20020211224442.48d0e668.hayase@hcn.zaq.ne.jp>,

[#33841] Re: 変数の宣言 — nobu.nakada@... 2002/02/11

なかだです。

[#33845] Re: 変数の宣言 — shudo@... 2002/02/12

> > > あえて宣言文の途中で、代入前に変数の値を使った場合にエラーを出そうと思うと、

[#33847] スクリプト言語 (Re: 変数の宣言 ) — TAKAHASHI Masayoshi <maki@...> 2002/02/12

高橋征義です。

[#33850] Re: スクリプト言語 (Re: 変数の宣言 ) — Takaaki Tateishi <ttate@...> 2002/02/12

At Tue, 12 Feb 2002 13:27:58 +0900,

[#33871] Re: スクリプト言語 (Re: 変数の宣言 ) — TAKAHASHI Masayoshi <maki@...> 2002/02/12

Takaaki Tateishi <ttate@kt.jaist.ac.jp> wrote:

[#33795] Re: 右辺の値なしでも実行可能? — "井上 浩一" <kyoui32@...>

井上です。

13 messages 2002/02/08

[#33807] Re: 右辺の値なしでも実行可能? — "井上 浩一" <kyoui32@...>

井上です。

38 messages 2002/02/08
[#33824] Re: 右辺の値なしでも実行可能? — "jihg" <jihg@...> 2002/02/08

jihg です。新入りです。

[#33825] Re: 右辺の値なしでも実行可能? — Tanaka Akira <akr@...17n.org> 2002/02/08

In article <000001c1b0c1$04eca980$b7d08bcb@soteccomputer>,

[#33831] Re: 右辺の値なしでも実行可能? — "jihg" <jihg@...> 2002/02/09

> Pseudo-Simplicity(擬似単純性)

[#33853] arguments for def [Re: 右辺の値なしでも実行可能? ] — Masaaki Sakano <mas@...> 2002/02/12

坂野 正明と申します。

[#33856] Re: arguments for def [Re: 右辺の値なしでも実行可能? ] — shukaku@... 2002/02/12

At Tue, 12 Feb 2002 19:14:03 +0900,

[#33867] Re: arguments for def [Re: 右辺の値なしでも実行可能? ] — Masaaki Sakano <mas@...> 2002/02/12

坂野 正明です。

[#33846] quickml サーバ — Satoru Takabayashi <satoru@...>

高林と申します

22 messages 2002/02/12
[#34082] SlowML /Re: quickml サーバ — rubiben <ozaki@...> 2002/02/25

るびべん です:

[#34086] Re: SlowML /Re: quickml サーバ — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#34100] Re: SlowML /Re: quickml サーバ — rubiben <ozaki@...> 2002/02/27

るびべん です:

[#34117] SlowML 実装実験 /Re: quickml サーバ — rubiben <ozaki@...> 2002/02/27

るびべん です:

[#33966] 「たまてばこ」開発版が SecurityE rror — dellin <dellin@...>

dellinといいます。

17 messages 2002/02/18
[#33968] Re: 「たまてばこ」開発版が SecurityError — nobu.nakada@... 2002/02/18

なかだです。

[#33972] world writeable dir (Re: 「たまてばこ」開発版が SecurityError) — Kazuhiro NISHIYAMA <zn@...> 2002/02/18

西山和広です。

[#34053] 漢数字 -> 数 — TOYOFUKU Chikanobu <toyofuku@...>

豊福です。

18 messages 2002/02/25

[#34056] ruby-dev summary — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

16 messages 2002/02/25

[ruby-list:33872] Re: 変数の宣言

From: 早瀬 康裕 <hayase@...>
Date: 2002-02-12 23:19:02 UTC
List: ruby-list #33872
早瀬@阪大です。

> > 説明ありがとうございます。納得しました。動的なスコープは確かにややこしいで
> > すね。宣言文中で代入前に値が使えてしまうのが、(おもしろい|何となく気持悪い)
> > ので質問してみました。
> 
> 宣言文中とは限りません。
> 
> if false
>   a = 1
> end
> p a
> 
> とか。

宣言文が実行されなかった場合でも、変数が宣言されるという事については、
ruby-lang.org を見て理解しました。その際に、デフォルト値としてnilが用いら
れるという事も知りました。

今回興味を持ったのは、宣言文の右辺で、宣言しようとしている変数が使えるとい
う点についてです。今まで、そんなことをしようと思ったことがなかったので…。
そこで、すぐに思い付いた他の言語で、宣言文での x=x を試してみました。
# 半ば現実逃避の、いい加減な調査です

============================================
C
---hoge.c---
#include <stdio.h>

int main()
{
        int x=x;
        /*int x;*/
        printf("%d\n", x);
        return 0;
}
-----------
gcc -O2 -Wall -ansi -o hoge hoge.c
# gccでは最適化オプションをつけないとuninitialized variableを検出できない
(エラー・警告なし)

icc -w2 -o hoge hoge.c
hoge.c:
"hoge.c", line 5: remark #592: variable "x" is used before its value is set
        int x=x;
              ^
============================================
java
---Hoge.java---
class Hoge
{
  static public void main(String argv[])
  {
    int x=x;
  }
}
---------------
javac Hoge.java
Hoge.java:5: 変数 x は初期化されていない可能性があります。
 int x=x;
       ^
エラー 1 個

============================================
% sml
Standard ML of New Jersey, Version 110.0.3, January 30, 1998 [CM; autoload enabled]
- val x=x;
stdIn:17.7 Error: unbound variable or constructor: x
============================================
emacs lips(xemacs)

(let '(x x) x) 
Symbol's value as variable is void: x 
(setq x x) 
Symbol's value as variable is void: x 
============================================
% irb
irb(main):001:0> defined?(x)
nil
irb(main):002:0> x=x
nil
irb(main):003:0> defined?(x)
"local-variable"
irb(main):004:0> defined?(X)
nil
irb(main):005:0> X=X
NameError: uninitialized constant X
        from (irb):5
irb(main):006:0> defined?(X)
nil
irb(main):007:0> defined?($x)
nil
irb(main):008:0> $x
nil
irb(main):009:0> $x=$x
nil
irb(main):010:0> defined?($x)
"global-variable"
# インスタンス変数とクラス変数も、未定義時に参照した時の値が定義されている
# ので、グローバル変数と同じ
============================================



gccで、int x; とした場合にはgccは、
hoge.c: In function `main': hoge.c:6:
warning: `x' might be used uninitialized in this function
という警告を発することができたのですが、int x=x; では警告も出なくなってし
まいます。これは、コンパイラの実装の問題ですが、ちょっと意外でした。

javaについては、ご指摘いただいた、
> ちなみに、Java では初期化されていない可能性がある変数を参照することを
> 禁止しています。Definite Assignment というやつですが、このようなことに
> 興味を持つなら言語仕様を読んでみるとおもしろいかも知れません。
という点でエラーとなっています。右辺で宣言中の変数を使うことそのものについ
ては禁止されていないようです。(int x=x=1 ならばエラー無くコンパイル出来る)

SML/NJやelispは、動的スコープ(というか環境?)なので、代入…じゃなくて定義前
に変数の値を使うことは出来ませんね。(あ、setqは代入でいいのか…)

ということで私の期待に反し(?)、CとJavaでは、初期値計算の前に名前が登録され
るようです。コンパイラの処理を考えてみれば、型と変数名が現れた時点でスコー
プに登録するのが自然なので、ある意味当然の結果かも知れません。

# Javaはともかく、Cは仕様書(またはそれに準ずるもの)に当るのが正しいと思う
# のですが、手をぬいてしまいました。

静的スコープを持つが、宣言しようとしている変数を初期値計算に使えない言語
をご存じの方がいらっしゃいましたら、教えていただけると嬉しいです。


-- 
早瀬 康裕
大阪大学基礎工学部情報科学科数理科学コース

In This Thread