さまざまな言語仕様について熱く語る闘技場
配列を作るたびに、いちいち array って、書かないといけないの、なんとかならないの? perlだったら、 @a=(1,2,3,4,5); これで、すぐに配列作れるのに。 なんで、いちいち、arrayとかって、 言ってあげないとわからないの? それと、配列のくせに、シジルが$なのも むかつきます。納得できません。 無知乙 関数ですよ キミはperlから入ってきたからPHPの仕様をよく知らないようだ >>6 無知な君のために証拠を見せてあげてもいいが、 見せてくれって頼まれてもいないのに見せたんじゃ、 知恵の押し売りになっちまうからな。 結論だけ。 システム仕様としてPHPのarrayは関数ではありません。 popって、配列関係の関数に決まってるのに、なんで いちいち、わざわざ array_pop とかって、「array」を接頭辞につけるの? pop、だけで十分、意味がわかるし、通じるじゃん。 実際、perlでは、「pop」だけで世の中回ってるよ? arrayは特殊ではあるが関数だよ 因みにissetやemptyは関数じゃない >>11 システム内で関数として定義されていると考えてよいの? システム内では関数ではないが、関数っぽい動作するから関数として考えてもいいっていう文脈ではなくて? なにやら混乱があるようだけど、 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で言えば、 高階関数にスペシャルフォームを与えることはできないのと同じ。 >>9 > popって、配列関係の関数に決まってるのに、なんで > いちいち、わざわざ > array_pop > とかって、「array」を接頭辞につけるの? それはたぶん、PHPに名前空間がなかったから。 Perlにはパッケージがある。 >>14 言語構成要素の1つではあるが何故関数で無いと言いきれるんだ? arrayの注意点にはこうある 注意: array()は、実際にはリテラル配列を表現するための 言語構成要素であり、通常の関数ではありません。 echoやissetはこうだ 注意: これは、関数ではなく言語構造のため、可変関数 を用いてコールすることはできません。 arrayは言語構成要素の1つではあるが 言語構造では無く特殊な関数と言うことじゃねぇの? ここらへんの説明よろしく >>14 言語構成要素の1つではあるが何故関数で無いと言いきれるんだ? arrayの注意点にはこうある 注意: array()は、実際にはリテラル配列を表現するための 言語構成要素であり、通常の関数ではありません。 echoやissetはこうだ 注意: これは、関数ではなく言語構造のため、可変関数 を用いてコールすることはできません。 arrayは言語構成要素の1つではあるが 言語構造では無く特殊な関数と言うことじゃねぇの? ここらへんの説明よろしく なんか改行が変になったので再 >>17 すまんが問われている意図がいまいちよくわからん。 逆に問い返させてくれ。 1. 「特殊な関数」って何だ?array()がその一つだと考えていることは分かっ たが、他にはどんなのがある? 自分の考えでは、PHPには「特殊な関数」というカテゴリはない。関数か、そう でないかだ。 で、関数かどうかは、「関数のように評価され実行されるもの」が関数だ。 array()は、構文解析器に備わった、関数を評価する汎用的な仕組みでは評価で きないから関数ではない。 array()を評価するためには、構文解析器にarray()専用の仕組みが必要だ。 2. 「言語構成要素」と「言語構造」の違いは何だ?PHPではどれが言語構成要 素で、どれが言語構造なんだ? 自分の考えでは、この二者に違いはない。いずれも、構文解析器に専用の仕組 みを必要とするものだ。 もしかしたらいるかもしれない外野のために補足すると、自分はLISPの、関数 とスペシャルフォーム(特殊形式)の解析方法の違いを念頭に置いて書いている。 そんな遠まわしに書かなくても、すっきり明快な答えの出し方がある。 もうすこし、関数を勉強してくれ、諸君。 そんな些細な言葉の違いを言うなら原文ではどっちもlanguage construct。 パーサトークンであり構文。 http://jp.php.net/manual/ja/tokens.php 注釈が違うのはそもそも何かを処理するものでもない arrayを可変コールすることなんざまずないからじゃね。 >>20 すまんがどっちを批判しているのか分からんかった。自分はSICPとか読んでる けど、まだ分かってかもと不安になっちゃったよ。 しかし、普通のプログラマが「関数」という概念そのものを勉強するメリットっ て、なかなか見えないだろうし、見えないと勉強しないと思うんだが。 >>21 おお、なんと明快な答えだ! 原文と、パーサトークンの一覧ページに当たれば、一目瞭然だな。 実はPHPの経験は浅いので、パーサトークンのページは知らなかった。ありがとう。 >>18 > 自分の考えでは、PHPには「特殊な関数」というカテゴリはない。 > 関数か、そうでないかだ。 特殊関数 つ ttp://jp.php.net/manual/ja/language.oop.magic-functions.php >>22 どちらか片方を批判してるわけじゃない。 簡単に結論が出る内容を、よくわかってない者同士が、状況証拠を 並べ立ててワーギャーやってるので、書いてみた >>23 なんだ、特殊関数という用語があるのか。 しかしそれはぜんぜん文脈が違う。__sleepや__wakeupは、特定の機会に必ずコー ルされるというだけで、評価の仕組み自体は通常の関数となんら変わらない。 >>24 それは失礼した。また恥をかいてしまったが、あなたのおかげで勉強になりま した。ありがとう。 >>25 おれは何も勉強させたつもりはないし、有用な情報は提示していないが? 特殊関数といっても、普通はマジックメソッドってみんな言ってるやつを 訳者が特殊関数って書いてるだけだと思う。 だからどうということはないが。 >>26 まあ勝手に感謝されたら気持ちが悪いかもしれないが、情報の価値はその受け 手が決めるもんです。PHP入門者の自分はまさにその情報を欲していた。 つうかあなたが「くだ質」スレに登場してたら、話は早かったのになあ。 http://pc11.2ch.net/test/read.cgi/php/1226517332/961- http://pc11.2ch.net/test/read.cgi/php/1228667259/13-27 まあ自分はあっちのスレには書いてないけど。 マジックメソッドについては分かってる。今度は原文をちゃんと読んだし。 >>27 理解したのなら俺にどちらなのか教えてくれ もし関数でなく言語構造というのであれば 何故態々”通常の”関数ではありません。 と書いてあるのか >>28 うん、関数ではなくて言語構造。>>21 氏のとおり、パーサトークン一覧に載っ ているから明らか。 "通常の" 関数(regular function) と書いている理由は分からんけど、自分は これは、通常の関数のほかに特殊な関数があるのではなくて、関数というもの は(みんな)通常、arrayは関数でない特殊なもの、と書いてるだけだと思う。 >>29 特殊な物なら何故通常のと態々つけるの? echoやincludeも()つけて書けて関数のような形に見えるけど それぞれの説明にちゃんと言語構造ですと書いてあり通常のとは書いて無いよ? >>30 でも>>29 のように、関数を通常、関数以外を特殊という読解もできるよね? もちろんあなたの言うようにも読める。原文の記述があいまいなんだよ。 で、決定的根拠は>>21 。 日本語訳した野郎の勝手な解釈が含まれてるってことだお [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)。 いや、原文があいまい。訳者は責められんと思う。 > Note: array() is a language construct used to represent literal > arrays, and not a regular function. >>31 関数以外を特殊と言うのであれば 何故issetやemptyあとlist等に通常と言う言葉が無いのさ arrayだけ別の表現をする意味が無いよね しかもだ 言語構成要素であり、通常の関数ではありません。 と言語構成要素という言葉があるの通常の関数ではないと 態々関数だけど特殊だよという風な書き方をしている >>33 ...。 あんまり勝負って考え方は好きじゃないなあ。 みんなが正しい結論に到達して、みんなが得した、と考える方がよくない? まあスレタイ通りではあるけど。 >>35 だからそれはPHPマニュアルの表記の不備だろうってば。 つうか、array はパーサトークンの一つだと>>21 で示されて、それでも状況証 拠を主張し続ける理由が分からない。 パーサトークンという言葉だけでは、あなたは納得できない? 顔真っ赤にして http://pc11.2ch.net/test/read.cgi/php/1226517332/961 を否定してた奴涙目? 961の時点で正解出てるのに土曜日から今までほんとに何やってんだ 言語構造か関数かは元のソースコードを見て判断するしかないだろ >>38 そういう言い方よくないと思うよ。彼(彼女)をきちんと納得させられないな ら、むしろ自分たちがダメなんだと思う。 >>39 それは違う。ソースを読んだって、>>21 と同じ情報が得られるだけだろう。 だめなのは無知なのに理由もなく一方の主張を崩さず納得しない方だろ 疑問に思うなら自分で調べりゃいいのに >>37 できないかな >>17 に戻るけど 言語構成要素の1つではあるが何故関数で無いと言いきれるんだ? 言語構造の一部である事はマニュアルにも"言語構成要素であり"と書かれている これらの原因がただ単にマニュアルの不備が原因である とは考えにくいよ・・・ もしarrayのマニュアルがarrayが出来てから 更新されていないというのであればそれも有りえるだろうけど >>41 貴様もよく知らないくせに罵倒だけは一人前だなwwwwww パーサトークンという言葉を説明すればいいのかと思ってググったが、 PHPマニュアルばかり引っかかって、自分涙目。 弱ったな。どこかに分かりやすい説明ない?(他力本願) 自分はLISPのごく簡単な処理系を作ってみる以外の方法を思いつかないが、 あまりにも非現実的すぎる。 ここで納得してもらうためだけに最低限必要な知識ってなんだろう。 さてと、パーサートークンなんてのは傍証に過ぎない。 なぜなら、パーサートークンかつ関数な特殊な関数である可能性を否定できないから。 しかし、おれはもっと確実にわかる方法を知っている。 もう少し、勉強したらいいよ諸君。 わかる方法を書いてくれないかな 知ったかなんていらねーんだよ >>45 > なぜなら、パーサートークンかつ関数な特殊な関数である可能性を否定できないから。 えー、そういう話なの? 演算子はトークンだけど、実際には関数が割り当てられている、みたいな? ここで問題になってるのは構文解析で、実装はまた別の話だと思ってたよ。 > しかし、おれはもっと確実にわかる方法を知っている。 > もう少し、勉強したらいいよ諸君。 勉強はがんばりますので、どうか教えてください。 構文解析の話に絞ったのは君のハンドリングに過ぎない 45はロジックとして証明にならないといっているだけ システム上のことはコードで確認する。 文理上のことはドキュメントで確認するのが道理。 結局のところ、話のレイヤーが違うってことだよな。 ドキュメント上は関数に分類されてて明確に否定されてないので関数であると考えるのが妥当。 ドキュメントはいろんな要件で書かれるからレイヤーの違いを理解できない人がいても仕方ないか。 システム上は判定一つ書けば結論でるしな。あれとか、それとか。 で、システム上はこうよ try { ReflectionFunction::export("array"); } catch(Exception $e) { echo $e->getMessage(); } ま、function_existsで調べればtrue falseで返してくれるわけだけど。 >>51 高木さんじゃなくて、大垣さんのほうが確実 ドキュメントもバグレポート出せば変わるから、 変わったその日から名実ともに関数じゃなくなるだろうね。 しかし、このルーズさというか曖昧さがPHPのいいところ 関数でも式でもないっていったって、言語構造っていったって、 if (include("test.php"))のreturnの扱いとか、特殊としか言いようがない。 めんどくさいから海外のMLとに投稿したり開発元にメールして聞いてみたらいいんじゃないの そろそろ結論でたでしょ。 ・言語解析上は、array()はT_ARRAYであって、T_FUNCTIONではない。 ・一般に関数とは、引数が与えられて一定の結果を返すものという意味では関数 ・ドキュメント上では関数に分類されているが、T_FUNCTIONではないという注釈がつく ・パーサートークンの中には式(≒関数)として評価されるものがいくつかある。 ・中でもarrayは関数的性質が強い。(副作用が少なく線形写像的) ・よって、ドキュメント上の表記に差異がある。 結論は各自が導きだせばよい 例1)array()は言語解析上は関数ではないが、一般論的には関数に分類される。 例2)array()は広義では関数だが、厳密には関数ではない。 例3)PHPの話をするなら言語解析だけで十分なので関数ではない。 などなど。 事情を分かった上であれば、害はない。 お、そうかい? > 結論は各自が導きだせばよい 結論 = f(事情); fの定義によって結論が変わるというのがこの現象のすべてで その例を出せば十分だろう。 echoが文字を出力するという結論に代わりがないように arrayもだせよ read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる