X



さまざまな言語仕様について熱く語る闘技場
0002nobodyさん
垢版 |
2008/12/08(月) 13:19:45ID:???
PHPのarray()は関数です。以上
0003nobodyさん
垢版 |
2008/12/08(月) 18:38:20ID:???
配列を作るたびに、いちいち
array
って、書かないといけないの、なんとかならないの?

perlだったら、

@a=(1,2,3,4,5);

これで、すぐに配列作れるのに。

なんで、いちいち、arrayとかって、
言ってあげないとわからないの?
それと、配列のくせに、シジルが$なのも
むかつきます。納得できません。
0005nobodyさん
垢版 |
2008/12/08(月) 19:01:20ID:???
arrayは関数ではありません。以上
0006nobodyさん
垢版 |
2008/12/08(月) 19:02:23ID:???
無知乙
関数ですよ
キミはperlから入ってきたからPHPの仕様をよく知らないようだ
0007nobodyさん
垢版 |
2008/12/08(月) 19:05:18ID:???
>>6
無知な君のために証拠を見せてあげてもいいが、
見せてくれって頼まれてもいないのに見せたんじゃ、
知恵の押し売りになっちまうからな。
結論だけ。
システム仕様としてPHPのarrayは関数ではありません。
0009nobodyさん
垢版 |
2008/12/08(月) 20:34:25ID:???
popって、配列関係の関数に決まってるのに、なんで
いちいち、わざわざ
array_pop
とかって、「array」を接頭辞につけるの?

pop、だけで十分、意味がわかるし、通じるじゃん。

実際、perlでは、「pop」だけで世の中回ってるよ?
0010nobodyさん
垢版 |
2008/12/08(月) 20:45:50ID:???
perlしか知らないからそう思うのです
0011nobodyさん
垢版 |
2008/12/09(火) 00:40:18ID:???
arrayは特殊ではあるが関数だよ

因みにissetやemptyは関数じゃない
0012nobodyさん
垢版 |
2008/12/09(火) 07:17:29ID:???
>>11
システム内で関数として定義されていると考えてよいの?

システム内では関数ではないが、関数っぽい動作するから関数として考えてもいいっていう文脈ではなくて?
0013nobodyさん
垢版 |
2008/12/10(水) 14:05:11ID:???
時代はwhitespaceですよ。
0014nobodyさん
垢版 |
2008/12/10(水) 16:15:22ID:???
なにやら混乱があるようだけど、 array() は関数ではないよ。echo などと同
様、言語構成要素の一つ。

array($x, $y,) のように、array()は最後の引数のあとにも , を置くことがで
きる。
http://jp.php.net/manual/ja/function.array.php

これは、array()の評価のされ方が、関数と同じではないことを示している。一
般のユーザがPHPやCで関数を書いて、array()と同じ挙動をさせることはできな
い。このことから明らかに、array()はPHPの構文解析器そのものに組み込まれ
た言語構成要素。

また array()はコールバックとして他の関数に与えることもできない。
http://jp.php.net/manual/ja/language.pseudo-types.php
これもやはり、 array()が関数ではなく言語構成要素だから。LISPで言えば、
高階関数にスペシャルフォームを与えることはできないのと同じ。
0015nobodyさん
垢版 |
2008/12/10(水) 16:17:25ID:???
>>9
> popって、配列関係の関数に決まってるのに、なんで
> いちいち、わざわざ
> array_pop
> とかって、「array」を接頭辞につけるの?

それはたぶん、PHPに名前空間がなかったから。
Perlにはパッケージがある。
0016nobodyさん
垢版 |
2008/12/10(水) 19:03:12ID:???
>>14
言語構成要素の1つではあるが何故関数で無いと言いきれるんだ?
arrayの注意点にはこうある
注意: array()は、実際にはリテラル配列を表現するための 言語構成要素であり、通常の関数ではありません。 echoやissetはこうだ
注意: これは、関数ではなく言語構造のため、可変関数 を用いてコールすることはできません。
arrayは言語構成要素の1つではあるが
言語構造では無く特殊な関数と言うことじゃねぇの?
ここらへんの説明よろしく
0017nobodyさん
垢版 |
2008/12/10(水) 19:04:48ID:???
>>14
言語構成要素の1つではあるが何故関数で無いと言いきれるんだ?

arrayの注意点にはこうある
注意: array()は、実際にはリテラル配列を表現するための 言語構成要素であり、通常の関数ではありません。

 echoやissetはこうだ
注意: これは、関数ではなく言語構造のため、可変関数 を用いてコールすることはできません。

arrayは言語構成要素の1つではあるが
言語構造では無く特殊な関数と言うことじゃねぇの?
ここらへんの説明よろしく

なんか改行が変になったので再
0018nobodyさん
垢版 |
2008/12/10(水) 20:16:36ID:???
>>17
すまんが問われている意図がいまいちよくわからん。
逆に問い返させてくれ。

1. 「特殊な関数」って何だ?array()がその一つだと考えていることは分かっ
 たが、他にはどんなのがある?

自分の考えでは、PHPには「特殊な関数」というカテゴリはない。関数か、そう
でないかだ。

で、関数かどうかは、「関数のように評価され実行されるもの」が関数だ。
array()は、構文解析器に備わった、関数を評価する汎用的な仕組みでは評価で
きないから関数ではない。
array()を評価するためには、構文解析器にarray()専用の仕組みが必要だ。

2. 「言語構成要素」と「言語構造」の違いは何だ?PHPではどれが言語構成要
素で、どれが言語構造なんだ?

自分の考えでは、この二者に違いはない。いずれも、構文解析器に専用の仕組
みを必要とするものだ。
0019nobodyさん
垢版 |
2008/12/10(水) 20:20:22ID:???
もしかしたらいるかもしれない外野のために補足すると、自分はLISPの、関数
とスペシャルフォーム(特殊形式)の解析方法の違いを念頭に置いて書いている。
0020nobodyさん
垢版 |
2008/12/10(水) 20:22:10ID:???
そんな遠まわしに書かなくても、すっきり明快な答えの出し方がある。
もうすこし、関数を勉強してくれ、諸君。
0021nobodyさん
垢版 |
2008/12/10(水) 20:26:39ID:???
そんな些細な言葉の違いを言うなら原文ではどっちもlanguage construct。
パーサトークンであり構文。
http://jp.php.net/manual/ja/tokens.php
注釈が違うのはそもそも何かを処理するものでもない
arrayを可変コールすることなんざまずないからじゃね。
0022nobodyさん
垢版 |
2008/12/10(水) 20:38:29ID:???
>>20
すまんがどっちを批判しているのか分からんかった。自分はSICPとか読んでる
けど、まだ分かってかもと不安になっちゃったよ。
しかし、普通のプログラマが「関数」という概念そのものを勉強するメリットっ
て、なかなか見えないだろうし、見えないと勉強しないと思うんだが。

>>21
おお、なんと明快な答えだ!
原文と、パーサトークンの一覧ページに当たれば、一目瞭然だな。
実はPHPの経験は浅いので、パーサトークンのページは知らなかった。ありがとう。
0023nobodyさん
垢版 |
2008/12/10(水) 20:40:14ID:???
>>18
> 自分の考えでは、PHPには「特殊な関数」というカテゴリはない。
> 関数か、そうでないかだ。

特殊関数 つ ttp://jp.php.net/manual/ja/language.oop.magic-functions.php
002420
垢版 |
2008/12/10(水) 20:41:34ID:???
>>22
どちらか片方を批判してるわけじゃない。
簡単に結論が出る内容を、よくわかってない者同士が、状況証拠を
並べ立ててワーギャーやってるので、書いてみた
0025nobodyさん
垢版 |
2008/12/10(水) 20:51:32ID:???
>>23
なんだ、特殊関数という用語があるのか。
しかしそれはぜんぜん文脈が違う。__sleepや__wakeupは、特定の機会に必ずコー
ルされるというだけで、評価の仕組み自体は通常の関数となんら変わらない。

>>24
それは失礼した。また恥をかいてしまったが、あなたのおかげで勉強になりま
した。ありがとう。
0026nobodyさん
垢版 |
2008/12/10(水) 20:56:36ID:???
>>25
おれは何も勉強させたつもりはないし、有用な情報は提示していないが?
特殊関数といっても、普通はマジックメソッドってみんな言ってるやつを
訳者が特殊関数って書いてるだけだと思う。
だからどうということはないが。
0027nobodyさん
垢版 |
2008/12/10(水) 21:10:56ID:???
>>26
まあ勝手に感謝されたら気持ちが悪いかもしれないが、情報の価値はその受け
手が決めるもんです。PHP入門者の自分はまさにその情報を欲していた。

つうかあなたが「くだ質」スレに登場してたら、話は早かったのになあ。
http://pc11.2ch.net/test/read.cgi/php/1226517332/961-
http://pc11.2ch.net/test/read.cgi/php/1228667259/13-27
まあ自分はあっちのスレには書いてないけど。

マジックメソッドについては分かってる。今度は原文をちゃんと読んだし。
0028nobodyさん
垢版 |
2008/12/10(水) 21:17:57ID:???
>>27
理解したのなら俺にどちらなのか教えてくれ
もし関数でなく言語構造というのであれば
何故態々”通常の”関数ではありません。 と書いてあるのか
0029nobodyさん
垢版 |
2008/12/10(水) 21:51:32ID:???
>>28
うん、関数ではなくて言語構造。>>21氏のとおり、パーサトークン一覧に載っ
ているから明らか。

"通常の" 関数(regular function) と書いている理由は分からんけど、自分は
これは、通常の関数のほかに特殊な関数があるのではなくて、関数というもの
は(みんな)通常、arrayは関数でない特殊なもの、と書いてるだけだと思う。
0030nobodyさん
垢版 |
2008/12/10(水) 22:08:54ID:???
>>29
特殊な物なら何故通常のと態々つけるの?
echoやincludeも()つけて書けて関数のような形に見えるけど
それぞれの説明にちゃんと言語構造ですと書いてあり通常のとは書いて無いよ?
0031nobodyさん
垢版 |
2008/12/10(水) 22:19:26ID:???
>>30
でも>>29のように、関数を通常、関数以外を特殊という読解もできるよね?
もちろんあなたの言うようにも読める。原文の記述があいまいなんだよ。
で、決定的根拠は>>21
0032nobodyさん
垢版 |
2008/12/10(水) 22:21:12ID:???
日本語訳した野郎の勝手な解釈が含まれてるってことだお
0033nobodyさん
垢版 |
2008/12/10(水) 22:24:30ID:???
[arrayは言語構造なの!] 攻撃:95 素早さ:40 防御:37 命中:83 運:43 HP:200
[arrayは関数だゴルァ!] 攻撃:28 素早さ:65 防御:37 命中:52 運:21 HP:163

arrayは言語構造なの! vs arrayは関数だゴルァ! 戦闘開始!!
[arrayは関数だゴルァ!]の攻撃 HIT [arrayは言語構造なの!]は1のダメージを受けた。
[arrayは言語構造なの!]の攻撃 HIT [arrayは関数だゴルァ!]は169のダメージを受けた。
[arrayは言語構造なの!]が[arrayは関数だゴルァ!]を倒しました(ラウンド数:1)。
0034nobodyさん
垢版 |
2008/12/10(水) 22:26:07ID:???
いや、原文があいまい。訳者は責められんと思う。

> Note: array() is a language construct used to represent literal
> arrays, and not a regular function.
0035nobodyさん
垢版 |
2008/12/10(水) 22:34:34ID:???
>>31
関数以外を特殊と言うのであれば
何故issetやemptyあとlist等に通常と言う言葉が無いのさ
arrayだけ別の表現をする意味が無いよね

しかもだ
言語構成要素であり、通常の関数ではありません。
と言語構成要素という言葉があるの通常の関数ではないと
態々関数だけど特殊だよという風な書き方をしている
0036nobodyさん
垢版 |
2008/12/10(水) 22:35:28ID:???
>>33
...。
あんまり勝負って考え方は好きじゃないなあ。
みんなが正しい結論に到達して、みんなが得した、と考える方がよくない?

まあスレタイ通りではあるけど。
0037nobodyさん
垢版 |
2008/12/10(水) 22:40:46ID:???
>>35
だからそれはPHPマニュアルの表記の不備だろうってば。

つうか、array はパーサトークンの一つだと>>21で示されて、それでも状況証
拠を主張し続ける理由が分からない。
パーサトークンという言葉だけでは、あなたは納得できない?
0039nobodyさん
垢版 |
2008/12/10(水) 22:46:02ID:???
言語構造か関数かは元のソースコードを見て判断するしかないだろ
0040nobodyさん
垢版 |
2008/12/10(水) 22:50:47ID:???
>>38
そういう言い方よくないと思うよ。彼(彼女)をきちんと納得させられないな
ら、むしろ自分たちがダメなんだと思う。

>>39
それは違う。ソースを読んだって、>>21と同じ情報が得られるだけだろう。
0041nobodyさん
垢版 |
2008/12/10(水) 22:57:43ID:???
だめなのは無知なのに理由もなく一方の主張を崩さず納得しない方だろ
疑問に思うなら自分で調べりゃいいのに
0042nobodyさん
垢版 |
2008/12/10(水) 22:59:45ID:???
>>37
できないかな

>>17に戻るけど
言語構成要素の1つではあるが何故関数で無いと言いきれるんだ?
言語構造の一部である事はマニュアルにも"言語構成要素であり"と書かれている

これらの原因がただ単にマニュアルの不備が原因である
とは考えにくいよ・・・
もしarrayのマニュアルがarrayが出来てから
更新されていないというのであればそれも有りえるだろうけど
0043nobodyさん
垢版 |
2008/12/10(水) 22:59:59ID:???
>>41
貴様もよく知らないくせに罵倒だけは一人前だなwwwwww
0044nobodyさん
垢版 |
2008/12/10(水) 23:01:51ID:???
パーサトークンという言葉を説明すればいいのかと思ってググったが、
PHPマニュアルばかり引っかかって、自分涙目。

弱ったな。どこかに分かりやすい説明ない?(他力本願)

自分はLISPのごく簡単な処理系を作ってみる以外の方法を思いつかないが、
あまりにも非現実的すぎる。
ここで納得してもらうためだけに最低限必要な知識ってなんだろう。
0045nobodyさん
垢版 |
2008/12/10(水) 23:05:31ID:???
さてと、パーサートークンなんてのは傍証に過ぎない。
なぜなら、パーサートークンかつ関数な特殊な関数である可能性を否定できないから。

しかし、おれはもっと確実にわかる方法を知っている。
もう少し、勉強したらいいよ諸君。
0046nobodyさん
垢版 |
2008/12/10(水) 23:08:18ID:???
わかる方法を書いてくれないかな
知ったかなんていらねーんだよ
0047nobodyさん
垢版 |
2008/12/10(水) 23:12:55ID:???
>>45
> なぜなら、パーサートークンかつ関数な特殊な関数である可能性を否定できないから。

えー、そういう話なの?
演算子はトークンだけど、実際には関数が割り当てられている、みたいな?
ここで問題になってるのは構文解析で、実装はまた別の話だと思ってたよ。


> しかし、おれはもっと確実にわかる方法を知っている。
> もう少し、勉強したらいいよ諸君。

勉強はがんばりますので、どうか教えてください。
0048nobodyさん
垢版 |
2008/12/10(水) 23:24:50ID:???
構文解析の話に絞ったのは君のハンドリングに過ぎない
45はロジックとして証明にならないといっているだけ
0049nobodyさん
垢版 |
2008/12/10(水) 23:35:07ID:???
システム上のことはコードで確認する。
文理上のことはドキュメントで確認するのが道理。
0050nobodyさん
垢版 |
2008/12/10(水) 23:44:02ID:???
結局のところ、話のレイヤーが違うってことだよな。
ドキュメント上は関数に分類されてて明確に否定されてないので関数であると考えるのが妥当。
ドキュメントはいろんな要件で書かれるからレイヤーの違いを理解できない人がいても仕方ないか。
システム上は判定一つ書けば結論でるしな。あれとか、それとか。
0051nobodyさん
垢版 |
2008/12/10(水) 23:46:15ID:???
高木さんならわかるんじゃないのかね
0052nobodyさん
垢版 |
2008/12/10(水) 23:51:08ID:???
で、システム上はこうよ
try {
ReflectionFunction::export("array");
} catch(Exception $e) {
echo $e->getMessage();
}
0053nobodyさん
垢版 |
2008/12/10(水) 23:52:01ID:???
ま、function_existsで調べればtrue falseで返してくれるわけだけど。
0054nobodyさん
垢版 |
2008/12/10(水) 23:54:32ID:???
>>51
高木さんじゃなくて、大垣さんのほうが確実
0055nobodyさん
垢版 |
2008/12/11(木) 00:02:45ID:???
ドキュメントもバグレポート出せば変わるから、
変わったその日から名実ともに関数じゃなくなるだろうね。

しかし、このルーズさというか曖昧さがPHPのいいところ
関数でも式でもないっていったって、言語構造っていったって、
if (include("test.php"))のreturnの扱いとか、特殊としか言いようがない。
0056nobodyさん
垢版 |
2008/12/11(木) 09:50:56ID:???
めんどくさいから海外のMLとに投稿したり開発元にメールして聞いてみたらいいんじゃないの
0057nobodyさん
垢版 |
2008/12/11(木) 10:07:48ID:???
そろそろ結論でたでしょ。
・言語解析上は、array()はT_ARRAYであって、T_FUNCTIONではない。
・一般に関数とは、引数が与えられて一定の結果を返すものという意味では関数
・ドキュメント上では関数に分類されているが、T_FUNCTIONではないという注釈がつく
・パーサートークンの中には式(≒関数)として評価されるものがいくつかある。
・中でもarrayは関数的性質が強い。(副作用が少なく線形写像的)
・よって、ドキュメント上の表記に差異がある。

結論は各自が導きだせばよい
例1)array()は言語解析上は関数ではないが、一般論的には関数に分類される。
例2)array()は広義では関数だが、厳密には関数ではない。
例3)PHPの話をするなら言語解析だけで十分なので関数ではない。
などなど。
事情を分かった上であれば、害はない。
0058nobodyさん
垢版 |
2008/12/11(木) 17:25:38ID:???
答えでてないじゃんあんたは例えだしてるだけでしょ
0059nobodyさん
垢版 |
2008/12/11(木) 17:45:58ID:???
お、そうかい?
> 結論は各自が導きだせばよい

結論 = f(事情);
fの定義によって結論が変わるというのがこの現象のすべてで
その例を出せば十分だろう。
0060nobodyさん
垢版 |
2008/12/11(木) 18:23:36ID:???
echoが文字を出力するという結論に代わりがないように
arrayもだせよ
レスを投稿する