前回の【無駄話】で記憶一般の周辺知見を得ましたが、今回は幼児期の記憶が思い出せない現象(幼児性健忘-infantile amnesia)と自我の形成との関係を考えてみたいと思います。

 

当たり前ですが、子供は生殖→妊娠→出産→乳児→幼児という過程を経て運動機能(「はいはい」、伝い歩き、よちよち歩き等)や精神機能(認知、理解、言語伝達等)を獲得してゆくことが観察されます。このような人間の経年成長に関わる心の研究であるを発達心理学)などと言います。

:参照にエリク・H・エリクソンが出てきますが、学生当時「私は誰か」という極めて実存主義的自我論を考えていた私は彼の著作である「自我同一性」も読みました。尤も彼の理論をそのままうのみには出来なかったのですが...

また、こどもの発達心理学に関して、フロイトを専攻した私として外せないのがフロイト発達心理理論(wiki)です。
書かれているようにリビドーを「性欲」と表現したために社会的バッシングを浴びたわけですが、リビドーの概念は寧ろ「生存への欲求」そのもので、自分としては漠然と

 

-(タナトス-攻撃) ← リビドー(生命エネルギー) → 正+(エロス-愛)

 

というイメージを描いていました。

 

一般に発達心理学とは「人間の生涯にわたる心の発展過程を研究する心理学分野」と定義されていますが、今回は特に「出産により新生児(出生後28日未満)として生まれた人間が、乳児(出生後1年未満)、幼児(学齢未満)を経て自我を獲得、成長させてゆく過程」で

 

何故人間は自我が形成される3~4歳頃以前のことを覚えていないのか

 

について考えてみます。(

:wikiの「幼児性健忘」では海馬が未発達で言語化できない為の記銘の失敗、または干渉による想起失敗のように書かれています。又河合先生の記事では同様の説明の後、「検索の失敗」によるものと考えられているようです。


河合先生の記事の中で「一般的に子どもは1歳半ごろまでに言葉を話し始めます。つまり,1歳半ごろまでに言葉を記憶しているのです。よく考えると当たり前ですが,それでも赤ちゃんのころの記憶がないように感じるのは,「いつ」「どこで」「なにを」したかというエピソード記憶が発達していないからでしょう。「自分自身についての記憶」であるエピソード記憶は発達がとても遅く,4歳ごろに機能するといわれます。このため,幼児期の記憶がないと感じるようです。」とあり、このことから「子どもの記憶を育てるには親の口から積極的に楽しかった、嬉しかったことを繰り返し伝えてあげましょう。日常の何気ない場面や感情、愛情を言葉にして子どもの記憶に積み重ねていくことも大切です。」ともいわれますが、心理学的には虚偽記憶(「偽りの記憶」-認知心理学が解き明かす「子どもの体内記憶」の真相)の問題も包含します。

さて、発達心理学では子供(人間)の自我形成については「客観的観察(子供の行動や表出の観察)」と「主観的観察(子供のに対する質疑の回答の分析解釈)」という二通りのアプローチがありますが、いずれの実験によっても、

(1)自己と他者の認知(注1

(2)投影投射)と同一化(取り入れ・摂取)(注2

(3)「時間認知」(注3

が重要になってくるのではないでしょうか?

注1自己と他者を意識・区別できるのは何歳からか?

「自己と他者を区別する」(神経現象学的記事)

自己と他者を意識・区別できるのは何歳からか?

自己と他者に関する認知科学的研究の紹介

幼児期における自他の特性に関する理解とその発達」(東京経済大学 全学共通教育センター准教授 野田淳子)
注2:同一視、投影、摂取は心理学における防衛機制、葛藤や脅威による不快な感情を緩和するために用いられます。
①同一視-自分にない優れた能力や名声を持つ他者を真似て自分を近づけること、自分の存在自体を他者に重ね合わせ、他者の状況を自分のことのように感じたり考えたりすること、自分が尊敬する人と同一になりたいという欲求から発生する同調現象
②投影-自分の感情や思考や動機を他人になすりつけること、受け入れがたい感情や性格などを、相手が抱いていると思い込むこと(投影性同一視という概念もあります。投影性同一視とは、投影と摂取の要素を合成したもので、自分自身の受け入れがたい感情や性格などを相手が抱いていると思い込み、相手へ「投影」したものを「同一視」することです。)
③摂取-他者の内にある考え方、価値観、感情などを自分の内に取り入れること、主に未熟な発達段階でのもので、他者を断片的に取り入れること

同一化と人格発達

注3

子供の時間知覚

幼児期における自己の発達と時間

幼児期中期の「自我」の発達と保育の課題」(京都府立大 教育福祉論・発達心理学教授 服部敬子)

様々な記事や論文から、乳児の段階では自我が未発達で自他の区別が乏しく、母親とのコミュニケーション(母親が<主体>の授乳の対象となる我("me")-客我、<主体>として母親を対象におっぱいを吸う我("I")-主我)が始まり、少しづつ自我が発達し、運動機能の発達とともに経験量が増えることにより「自分の客体化」が進んで主客分離が進んで「自己の客体化により、主体を他者に投影したり」「他者に自己を投影させることにより、他者の内面を推し量ったり」することが出来るようになるように思えます。

 

幼児性健忘」が「海馬が未発達で記銘ができない」「(多重関連付けにより)干渉により想起できない」というよりも、主我と客我が分離した「混乱した自我」が統合される「自我のパラダイムシフト」の際に、旧主我に関連付けられた記憶と旧客我に関連付けられた記憶が関連付け(データリンク)を失い、「検索できない」ようになるのでしょうか?「幼児性健忘」に関わる様々な実験も行われています。(「幼児期記憶の感情と年齢差」(慶応義塾大学学術情報リポジトリ))

一部の自閉症スペクトラム症では幼児記憶がある、という記述がありますが、自我統合が不完全で記憶リンクがそのまま残っているとかの(こじつけ的)解釈もできるように思います。

 

何れにしても、「幼児性健忘」と自我の発達や時間認識は密接な関連があり、人間存在のあり様、ひいては人格障害の機序を理解するうえで大きなヒントとなるように思えます。

 

【Psycho】シリーズを始めようと思ったのは良いのですが、その対象領域や深さが大きく、また前提となる知見も多々あるのでどうやって進めようかと悩んでいるこの頃です。

 

とはいえ、

 

何もしないわけにもいかず、現在【Psycho】シリーズの全体像を考えつつ、周辺知見を【無駄話】で綴っていこうかと思っています。

 

という訳で「記憶」。

 

「メモリー」「変数やプロパティ」等、プログラミングにも関連するテーマですが、人間の身体となると比較にならないほど複雑且つ高水準で設計されています。(注)

注:これから述べる「記憶」は勿論、知覚、情報伝達、生殖と種保存等(人間は勿論)動物をシステムオブジェクトと考えると本当に凄いなぁ、と感じ入ります。まぁ、それが「創造主=神」の存在を信仰する基盤となるのでしょうが...

 

1.先ずは「記憶」とは何か?

辞書的な意味でいえば、「過去に体験したことや覚えたことを、忘れずに心にとめておくこと。また、その内容」だそうですが、心理学では「生物体に過去の影響が残る、または過去の経験を保持し、これを再生・再認する機能の総称」となります。これから考えてゆくことは記憶の機能や仕組みの側面であるとお考え下さい。(できれば、アナロジーを入れてプログラミングのフレーバーも持たせるようにしましょう。

 

では「記憶の機能やプロセス」はどうなっているのか、というと、一般的には次の様になります。

 

①記銘(memorization)・・・感覚器官より入力された情報を覚える機能(私見では、外部刺激を受容器官で検知して、その入力データを意味のあるもの-「情報」として認知する、ことが示唆されてると思います。)

➁保持(retention)・・・記銘によって覚えたことを忘れずに維持し続ける機能(私見では、データの保持ということですが、データの形式、プロトコル、ストーレージに関わる仕様は取り敢えず問われていません。)

③想起(remembering)・・・保持した情報を思い出す機能(私見では、「覚えている-remembering」ではなく、意識の俎上に上げる-recallingではないかと。情報は適切な形式に、プロトコルに則って、且つ正しい場所から取り上げられ、言語化可能な情報<概念>や画像・音声等の非言語情報<観念>(注)として脳<海馬>に戻されることを明記しておくべきでしょう。)

:「真っ赤な夕焼け」という(言語化された)記述情報と、「夕焼けの鮮やかなイメージ」という画像情報は別物です。又一般に「言語中枢のある左脳、映像記憶の右脳」といいますが、「優位半球、劣位半球」で異なるようです。(参考

 

私見ですが、外部からの刺激(入力)が感覚器(受容器)で取り入れられた後、それを主体(自我)が「処理できる型にして=認知して」それを記憶対象情報にしていると考えられます。又、リソース(記憶情報)使用の効率、有効化から「忘却」により、キャッシュメモリーのような揮発性のある一時的な記憶から、PCでいえばHDやSSDのような非揮発性外部記憶媒体で保存するような長期的記憶に選別が行われているようです。

 

2.「記憶」に関わる用語(概念)-参考:記憶の分類

心理学では次の三つの区分があるそうです。

 

(1)「感覚記憶」-最も保持期間が短い記憶で、各感覚器の外界から入力された刺激情報。(例:視覚・・・光情報、聴覚・・・音波、嗅覚・・・揮発性の物質、味覚・・・溶解性の物質、触覚・・・温度や圧力等-但し、私見では感覚受容器が受けたものをそのまま記録するのではなく、脳が認知した特定の記憶情報として記銘されるのだと思います。)

 

(2)「短期記憶」-海馬に「キャッシュメモリー」の様に保持され、数十秒程度の保持期間、情報量も制限がある記憶。

 

(3)「長期記憶」-忘却を免れた短期記憶の一部が長期記憶として大脳皮質で数分から一生にわたって保持される。内容的には陳述記憶(エピソード記憶意味記憶)と非陳述記憶(手続き記憶、プライミング等-臨床医学の注参照)がある。

:①エピソード記憶

個人が経験した「例:昨日の夕食をどこで誰と何を食べた」というような出来事に関する記憶で、その経験と様々な付随情報(時間・空間的文脈、そのときの自己の身体的・心理的状態など)の両方が(海馬,海馬傍回を中心とする側頭葉内側部,視床と乳頭体を中心とする間脳,前脳基底部等が関連して)記憶されていることが特徴。因みに臨床神経学において「記憶障害(時間的順序や相互関係がわからない,自由再生できない)」というのは通常はエピソード記憶の選択、取得に障害あると考えられている。

意味記憶

1年は365日である」とか,「太陽は東から昇る」というような(側頭葉前方部・下部が関連して)記憶された知識に相当し、言語とその意味(概念)、知覚対象の意味や対象間の関係、社会的約束など、世の中に関する組織化された記憶。エピソード記憶が抽象化されたものと考えられています。

 

臨床神経学では次のような三区分になります。

 

(1)「即時記憶」-情報の記銘後すぐに想起させるもので、想起までに干渉を挟みません。

 

(2)「近時記憶」-近時記憶は即時記憶より保持時間の長く(数分~数日)、情報の記銘と想起の間に干渉が介在されるために保持情報が一旦忘却され、その後再生されます。

 

(3)「遠隔記憶」-近時記憶よりもさらに保持時間の長い(~数十年)く、イメージや言語として再生される陳述記憶と意識上に内容を想起できない非陳述記憶()に別れます。

:非陳述記憶とは、(言語的、記述的に)意識化することなく無意識で記憶、想起されるもので、手続き記憶、プライミング、古典的条件付け、非連合学習などが含まれます。

①手続き記憶-自転車に乗る方法やパズルの解き方等同じ経験を反復することにより形成される運動技能、知覚技能、認知技能。②プライミング-過去の経験によって対象の同定を促進(あるいは抑制)される現象。

③古典的条件付け-梅干しを見ると唾液が出るなどのような経験の繰り返しや訓練により新しく形成された反応(行動)。

④非連合学習-同じ刺激の反復によって反応が減弱したり(慣れ)、増強したり(感作)する学習。

 

3.記憶が長期化される要因

記憶の再生には大脳辺縁系の中の「海馬(かいば)」と呼ばれる部位の生物時計がドーパミン等の神経伝達物質を活性化することに関係があるといわれ、様々なWEB記事で長期記憶に残りやすい情報は(特異な経験等により生じる)感情がドーパミン等の神経伝達物質を強く活性化するからだそうです。

参考:「記憶を思い出すには体内時計が必要である」、「新奇な体験による記憶の保持の強化の機構

 

確かに「長期記憶に残すべき重要な記憶=感情を伴うような経験の記憶(例:災害被災経験)」ですが、その理由も(私見ですが)感情は主体(自我)の心理的反応(例:恐ろしい)であり、「自我の情報に対する評価」とも言えますので、評価済情報を再生することにより生存確率が高まる(例:恐ろしいから回避行動をとる)、即ち再利用価値も高い、という合目的性があるように思えます。

 

4.記憶メカニズムの器質的説明

記憶(昨日)は脳がつかさどることは誰もが知っていますが、その具体的な仕組みを少し(文系の心理学に興味がある人が知っておくべき程度)だけ見てみましょう。


ニューロン(神経細胞)」は、「シナプス」と呼ばれる「神経細胞同士が接続して電気信号を介して情報伝達を行う構造」を持ち、脳や脊髄、筋肉、腺など神経系全体に存在します。ニューロンとシナプスは、電気信号を介して情報伝達を行い、脳の機能を支えています。私見では、シナプスは丁度OOPプログラミングでいう「クラス(接続の仕方に関わる設計図)」、ニューロンはクラスに基づき生成されたインスタンス、と考えると腑に落ちやすいでしょう。

 

また、ニューロンの「接続」については、

 

(1)ニューロンは細胞膜を伸ばして他のニューロンと接続し、

(2)その接続部分をシナプスと呼び、神経伝達物質が放出されて信号が伝達されます。

(3)情報の「鍵」となる出力を「シナプス前方-(グルタミン酸、GABA等の神経伝達物質の出力)」といい、

(4)情報ドアの「錠」となる入力を「シナプス後方-(受容体による神経伝達物質の入力)」といいます。

 

人間の脳細胞がPC等の(ノイマン型)コンピューターと大きく違うのは、「コンピューターは特定のプログラムを忠実に実行するだけ」で何度プログラム実行しても同じことを繰り返すだけなのですが、ニューロンの集合である脳は「(ニューロンを接続する)シナプスが、様々な外的刺激(入力)を認知し、それを様々な経験という形で記憶し、接続(関連付け)を変化させることにより学習し、発展してゆく構造(シナプス)」を持っていることです。プログラミングでいえば、プログラムを実行するとプログラム自体を書き換えてくれるような、そんなシナプスの特性を『シナプスの可塑性』というそうです。

<参考>

記憶の持続メカニズムを解明

シナプス可塑性とは?

 

私見ですが、この知能の特徴というべき「シナプスの可塑性」(即ち「ニューロンの接続構造=シナプス」自体の特性)は、「入力に応じて、入力を評価し、その結果から出力のみならず評価系すらも更新する」という「学習」の源泉なのですが、この「メタシステム」というべきものはDNAにより、種毎に世代から世代へと(生殖、妊娠、出産という個の再生さん、種の保存システムで)受け継がれていくというのは

 

偶然にできたには精巧すぎる!

 

と感じ入ってしまいます。

 

5.忘却の仕組み

記憶が時間の経過とともに失われていく過程(忘却)に最初に目を向けたのは19世紀のドイツの心理学者エビングハウスで、実験に基づき「忘却曲線」を発表しました。では現在、忘却はどのように起きると考えられているのか、その原因について触れます。

 

(1)減衰(劣化)

砂の上に書いた文字や、ペンキで書いた絵が時間が経つとだんだんと薄れていくように、記憶も記憶保持媒体の減衰や劣化により忘却が生じるという考え方です。コンピューターでいえば、データを保持する媒体の物理的寿命でデータもお釈迦になるのと同じですね。なお、ニューロン自体は変わってゆくのにデータ(神経伝達情報)がなぜ保持されるのか、という疑問に関しては「なぜ記憶を保持できるのか? 脳の「現場」を見ることで解明」を参照して下さい。

 

(2)干渉

記憶内の情報は(例:犬)、シナプスにより他のさまざまな情報(例:猫、牛、馬)に関連付けられ、それが統合されて抽象的な概念(例:4足動物)などを作っていると考えられますが、それらが妨害(confrict)し合って忘却が生じるという考え方で、「干渉説」と呼ばれます。干渉には既に記憶している古い情報が新しい情報の記憶を妨害する「順行干渉」と、新たに記銘する情報が既に記憶内にある情報に対して妨害的に働く「逆行干渉」があります。これをコンピューターに譬えるなら、データベースの特有であるべきインデックスが重複し、複数のレコードが選択されてエラーになるような場合でしょうか?

 

(3)検索の失敗

自分が経験した過去の出来事等、エピソード記憶が思い出せない場合、「思い出すべき何かが分からない」ような記銘(外部刺激の認知)の不具合、きちんとした認知情報の記憶が失われてしまう保持の不具合(減衰)、そして干渉を含む想起の不具合が考えられます。「老人あるある」の「あれ、あれだよ」「あれを何して」などというのも「記憶対象が存在し、それが記憶有れていることは認知しているが、それが『どこにあるのか分からない』」という、PCでいえば「リンク切れ」のようなものでしょう。つまり、思い出せないのは記憶が消失したわけではなく、それを検索、取得できないためだからです。

 

6.記憶障害とは

既にみてきたように、記憶障害とは「記銘」「保持」「想起」のいずれか、またはすべてに不具合があることを言い、詳しくは「記憶障害:覚えられない,覚えていられない,思い出せない」(日本神経心理学会)を参照して下さい。

 

【Psycho】シリーズを始めるにあたり、その

 

対象領域の広さと深さ

 

にどう取り扱ったらよいか、

 

正直困惑

 

しています。

 

そんな訳で現在

 

錆び付いた半世紀前の知見のバージョンアップ

 

の為にWEB学習で

 

現在の精神心理界隈をうろついて再学習している現状

 

です。

 

と、いうことで

 

(余り書くことがないので)本日は前々から「社会学的疑問」であった

 

日本人の髭は敗戦後、何故なくなったのか?

 

について書いてみます。

 

私自身は

 

(1)米国研修半年間

(2)米国駐在5年間

(3)完全定年の65歳以降

 

に髭((1),(2)は口髭のみ。(3)は口髭と顎髭)を生やしていますが、それで明らかなように

 

日本ではまともな人間は髭を生やさない

 

ので、外国にいるときとか、社会の一員である会社からドロップアウトした後に生やしているわけです。では、この

 

不適切と感じられる=社会的抑圧

 

はどのように発生してきたのでしょうか?歴史的に見ると、髭は日本において絶対的に不適切と考えられていた訳ではなく、

 

【近代以前】

昔から日本では男性があごひげや口ひげを生やす風習がありました。しかし、戦国時代が終結すると武士が必要なくなった為、浪人化し、辻斬りやばくち等が横行するようになり、政治的安定を求めた江戸幕府は治安維持の為、「大髭禁止令」を発令し、髭を伸ばすことを禁止しました。

 

【明治~太平洋戦争】

明治や大正の世では、政治家、軍人は勿論、知識階級に至るまで男性が髭を生やすことが当たり前となりました。

 

【戦後~現代】

戦後においては、法令による禁止があった訳でもないのに、男性が髭を蓄えることはなくなり、勤め人を中心とした「社会の表立った人々」は無髭となり、例外はアウトローやアーティスト等社会の裏とか脇とかにいる人が髭を蓄えるようになりました。

 

(参考)

「ひげの話」

「男とヒゲの歴史」
「髭と日本の文化」
「ヒゲの日本近現代史」 阿部恒久・共立女子大教授

 

当時精神分析を専攻していた私は

 

(1)髭=(時代や地域、民族によるが)権力や威厳、強さ、男らしさといった象徴

(2)その髭を落とす=権力や威厳、強さを奪取し、精神的去勢(男らしさの剥奪)

 

を企図し、日本人の反抗、抵抗を抑制する為の

 

「戦後GHQによる占領戦略の一環ではないか?」

 

と考えていました。

 

今になってこのことを思い出し、(当時は出来なかった)インターネットサーチを行いましたが、私の仮説を支持してくれるようなものは

 

全くありませんでした。残念!

 

ps. と考えましたが、為念、Chat-GPT様のご意見を伺いました所、以下のような

 

おおっ!、という所見

 

でした。

 

【CHat-GPTへの質問】

日本では太平洋戦争後、男が髭を落とし、現在は髭を生やして社会生活を送ることが不適切の様に言われます。男の髭は権力や力、男らしさを象徴していると思われますが、これを強制的に落とすことにより、象徴的去勢と考えるような精神分析的仮説はあるでしょうか?

 

【Chat-GPT】

精神分析的な視点から、髭を剃ることを「象徴的去勢」と捉える仮説は十分に考えられます。特に、フロイト派やラカン派の視点を用いると、髭を落とすことが社会的・文化的にどのような意味を持つのかを解釈することができます。


1. 象徴的去勢(Symbolic Castration)の概念

フロイトやラカンの精神分析では、「去勢(castration)」は単に身体的な現象ではなく、象徴的なレベルでの権力・欲望・アイデンティティの喪失を意味します。
ラカンにおいては「象徴的去勢」とは、主体が大きな他者(象徴界)に服従し、自らの欲望を抑圧される過程を指します。
つまり、社会規範に従うために「何か」を失うことが、「去勢」として理解されるのです。


2. 髭と男性性の象徴性

髭は歴史的に、男性性・権力・成熟の象徴とされてきました。
・ 古代ギリシャやローマでは、髭は哲学者や戦士の威厳を示すものだった。
・ 中世ヨーロッパでは、騎士や王が髭を生やし、権力の象徴となった。
・ 日本では、武士や僧が髭を蓄えることがあり、明治期以降も政治家や軍人が髭を持つことが権威の象徴だった。

しかし、太平洋戦争後の日本社会では、欧米化の流れの中で「清潔さ」「均一性」が重視され、髭を剃ることが標準化しました。特に、公務員・企業戦士のような「組織の一員」としてのアイデンティティにおいて、髭を落とすことが求められたのです。


3. 髭を剃ることの象徴的去勢

この流れを精神分析的に解釈すると、男性の権威や力を示す「象徴」としての髭を取り除くことは、「象徴的去勢」に相当すると言えます。つまり、社会が求める「従順な主体」となるために、個人の権力や男性性の象徴を切り落とすという構造が見て取れます。

具体的には:

  • 戦後の民主化・平和主義の流れ → 軍国主義的な価値観の否定(髭を生やす旧軍人の影響を薄める)
  • 企業社会における均質性の要求 → 個の強さを示す髭より、組織への適応が重視される
  • 「清潔さ」や「若々しさ」の美徳化 → 髭を剃ることで「フレッシュ」な印象を持たせる

これらのプロセスを通じて、髭を剃ることは社会的規範への服従=象徴的去勢とみなすことができます。


4. 日本社会の「象徴的去勢」文化

日本社会は、集団への同調圧力が強く、個人のアイデンティティよりも「組織の一員」としての役割が重視される傾向があります。
この中で、髭の除去が「個人の力を削ぐ行為」として機能する可能性は十分に考えられます。

例:

  • 学生の坊主頭(戦前の軍隊的規範の名残)
  • 企業戦士のスーツ・ネクタイ文化(個性よりも組織の一部であることを強調)
  • 「黒髪ルール」や「標準的な服装」への同調圧力

これらの規範と同様に、「髭を落とすこと」もまた、社会的同調を強いる手段の一つとして機能してきたと考えることができます。


5. 現代における変化と再考

最近では、髭を生やすビジネスマンや芸能人も増え、日本社会における「髭=不適切」という価値観は徐々に変化しつつあります。
ただし、企業文化や公務員の世界では依然として「髭を剃ること」が標準とされています。
このような背景を踏まえると、髭を生やすことが「去勢からの脱却」や「新たな男性性の再構築」として機能する可能性もあるでしょう。


6. 結論

髭を剃ることが「象徴的去勢」となるという仮説は、精神分析的に十分に成立するものです。
特に、戦後日本の社会変化を踏まえると、髭の除去は**「個人の権威・力の象徴を排除し、社会的規範に適応させるための儀式」**とみなすことができます。

ただし、近年の価値観の変化により、髭を生やすこと自体が「新たな自己表現」や「男性性の回復」として機能する可能性もあり、今後の文化的変遷が注目されるところです。

 

プログラミングネタに詰まり、「昔取った杵柄」で精神心理関係の再学習を兼ねて【Psycho】シリーズを始めようと思いましたが、「そんなんが、プログラミングと関係あるの?」という疑問を持たれる方もおられると思うので私なりの考えを書いておきます。

 

プログラミング言語は処理を中心とした「手続き型」以降に、データと処理を一緒くたにした(このブログで扱うC++やC#のような)「OOP(Object Oriented Programing)型」に移行してゆきます。OOPは「『クラス』という設計図に基づく実体としての『オブジェクト』を生成し、オブジェクトの中に(フィールド(Fields)や)プロパティ(Propaties)等のデータと様々な処理(Methods)を行い、文書作成、表計算、プレゼン、動画、音楽・音声その他の目的に応じた『仕事(Works)』をします

 

これを基に(無理矢理)人間にOOPを当てはめて、C#っぽくプログラミングしてみましょう。

 

using 森羅万象摂理;    //宇宙とその摂理

using 物:                   //有体物に関わる摂理

using 情報;                //無体物に関わる摂理

using 社会;                //「自」とその反映としての「他」の集積体

 

namespace 国家         //社会に基づくインスタンスとしての国家

{

    public class 人間 : 動物    //物->生物->動物から派生させる

    {

        //プロパティ

        const int 余命; {private set;}; //コンストラクターで決定される

        int 年齢 {private set; get;};    //単なる例示(以下同じ)

        int 性別 {private set; get;};

        情報 画像[];

        情報 音声[];

        情報 言語[];

        ...

        //メソッド

        人間();           //人間クラス(DNA)に基づくコンストラクター(誕生)

        ~人間();         //死亡に伴うリソース等の解放

        void 変異();    //人間を承継元とする派生クラスの生成(動物から人間が出来たように...)

        .

        .

        .

        var 記憶(var 情報);    //様々なデータに対応するようオーバーロードがある

        var 成長(var 栄養や情報);    //栄養による器質(肉体)的成長、情報による精神(情報処理)的成長

        人間.交信 交信(人間.交信);    //人間の更新メソッドの出力が入力となるような通信メソッド

        ...

    }

}

 

これを仮想コンパイルして(地球上の他のnamespaces<世界>の中の)「日本」という国家が出来、そのプログラムで人間というクラスの「私」が誕生し、社会ライブラリーに基づき他の人間インスタンスと交信メソッドによりコミュニケートを始め、栄養や情報を摂取して成長し、それを記憶し、最後に年齢が余命になると死にます。

 

このような捉え方をすると、「人格」とは「他の『自(人間)』の交信出力を入力することにより、人間のプロパティである特性が変化し、それによって返す出力に変化が生じて」形成されてゆく「オブジェクト全体(像)」ではないか、と考えられます。

 

また「パーソナリティ(人格)障害」とは、「自己の交信メソッドで入力される『他からの交信出力』によって返される、自己の交信出力が『他の交信入力』の(人間.交信)型ではなく、違反としてエラーとなる場合」ではないか、と考えられます。具体的に言えば『他からの交信出力』が誹謗・中傷等のヘイト情報であれば、一般的に返される交信出力(他が期待または予期する-人間.交信で受容出来る入力型)は「憤怒」「悲哀」「無視(無反応)」等及びその関連表現である「怒声」「涙」「逃避」その他であるところ、全く異なる型(例:「排泄行為」)や関連しない行動である場合、他は自のことを異常(「おかしい」「狂っている」「気違い」)として認知することになるのではないでしょうか?(またその場合、自が他の異常認知という反応を「交信エラーとして感知して修正するメソッド」を行わない、ということも付け加えなければなりません。

 

そんなことを考えながら、今後【Psycho】シリーズをプログラミングコンテキストで考えていければと思っています。

 

前回、昔の根っこから「承認要求」に関わる駄文を載せましたが、このブログも(殆どの小規模開発をやりつくした感がある中で)自らの来し方を振り返り(またネタ探しにもなりうるので)少し

 

Psycho

 

がらみのネタを書いてゆこうかと思います。

 

一般に"Psycho(気違い)"というのはPsychopathの通称の様に使われますが、人間の精神に関わる学問には全てこれが付きます。例えば「心理学」を"Psychology"、「精神医学」は"Psychiatry"、「精神分析学」は"Psychoanalysis"というようにです。では、何故私が"Psycho"に関心を持つようになったのか?そこらへんから始めます。

 

1.背景

私が生まれたのはベビーブーマー世代の少し後で、私学の中学生の時に学生運動を経験し、高校に入った途端三島由紀夫が市ヶ谷で自決します。このようなやや社会的に混乱した背景で思春期を迎え、ものを考えるようになり、哲学面ではカント、デカルト、ニーチェから始め、キェルケゴール、ハイデガー、サルトルやカミュ等実存主義に傾倒して行き、文芸面ではボードレール、コクトー、ランボーやラディゲ等に惹かれ、大学も社会学部でフロイト、ユング等の精神分析を専攻し、終いには「引き裂かれた自己」(1960年)や「自己と他者」(1961年)を著わした「反精神医学」の精神科医R.D. レインに興味を持ち、このような精神疾患こそ将に「人間存在に特有の有り方」が引き起こす誇張された現象ではないか、それを普遍的人間存在のヒントと考え、「自己とは、他者とは何か」という中心的課題を卒論を書くに至りました。

 

2.反精神医学とその後

反精神医学」とは何か?それはこれ(by 佛教大学 阿部あかね)に詳しく書かれており、一言でいうなら次の引用文で足りると思います。

 

『反精神医学とは、一言でいえば、伝統的正統的主流的精神医学の狂気観に対する根本的な異議申し立てであ る。つまり伝統的精神医学が 19 世紀以来身体医学の枠組みや概念をそのまま踏襲し、『狂気と正気』の問題を 純医学的立場から考察し、狂気イコール疾患とみなしつづけてきたとしての異議申し立てである」(笠原 1976: 675)。

 

この運動の高まりは論文にあるように、丁度私が大学を卒業する時点が本論文の3-3辺りに書かれている頃で、私も傾倒しました。一方、今振り返ってみればの日本精神神経学会理事長(当時)でロボトミー手術を人体実験と批判された臺氏の主張の引用、即ち「臺は、『精神医学は生物科学の一分野であり、内因性精神病は生物学的疾患であるとする』と主張するが、同時に『精神医学は生物科学の一分野であるべきだという規定は必要条件であって、十分条件であるという意味ではない』(臺  1976: 719)とも付け加える。すなわち、精神分裂病は基本的には生物学的疾患として個人の身体内部の問題であ るが、社会環境や心理的要因もあわせて考える必要があるという。ゆえに、反精神医学についても『反精神医学の 誤りは、一部の汎精神療法家と同じく、その汎心理主義(汎政治主義までを含めて)にある。精神障害をその心理的、社会的側面だけでわりきろうとすれば、その破綻はかならず治療面に現われてくる』(1976: 719)とのべる。これは、反精神医学が生物科学的側面を軽視し、社会・心理的側面のみに傾倒しているとの批判である。」には十二分に耳を傾けなければならないと考えられます。

 

結局、「反精神医学」は当時の2大精神疾患()である「躁うつ病(現在の『双極性障害』)」と、特に「精神分裂病(現在の『統合失調症』)が、器質的原因が特定できず、その症状の社会性(対人関係)と患者の人権をどうとらえるのか、という問題に対する社会政治的運動であり、精神療法だけでは症状の改善が進まなかったり、医学上の検査技術の科学的進歩と「向精神薬(Psychoactive drug、 Psychotropic)」の発達により患者の症状が抑制され始めたことから急速に萎んでゆきます。一方、患者の人権と身体的拘束問題は残念ながら解決されたとは言えない状況です。参考までに2023年5月20日付日本精神神経学会のわが国の精神科医療・保健福祉のあるべき姿についてを参照しておきます。

:当時受講した「異常心理学」では精神疾患を、脳損傷等器質的原因が特定できる「器質性精神病」、向精神薬の違法摂取を含む薬物等の原因による「薬物性精神病」、その他の不特定原因で本人の病識のない「精神病」、本人に病識の有る「神経症」、病気や疾患とは呼べない「異常性格(精神病質)」、今では不適切極まりない「同性愛」等の分類があったと記憶しています。現在は国際疾病分類(ICD-10)による分類や米国の「精神疾患の診断・統計マニュアル(DSM)」が参照され訳語も「病」や「障害(disorder)」が「症」に変化してきています。

 

3.で、私は何をしたいの?

異常、否、以上で私の「ねっこ」から現在の現状まで簡単に俯瞰しましたが、肝心の

 

Psycho

 

については、日本の精神医療から離れて、webで見つけたDSM5に基づく、

 

私や貴方が日常経験することあるべき

MSD 版「パーソナリティ障害の概要」

 

を基に内省と考察をつづってゆこうかな、と考えています。

 

ps. ところで上のMSDのマークが似ていることもあり、最初Microsoft関連かと本気で思ってしまいました。まぁ、きっかけってそんな些細な事なんです。

 

プログラムネタが未だないので、新春一番の駄文を書かせていただきます。そのテーマは、

 

「承認欲求」

 

私にとってこの語は「最近とみに目立つようになってきたな」という印象の言葉で、「いかにも心理学用語」ですが(まかりなりにも社会学士で、社会心理学や精神分析学を専攻した私ですが、浅学にて)あまりピンとこない言葉だったので引っ掛かっていました。

 

であれば、ネタにしちゃおう!

 

ということで、今回はこの語について調べてみました。

 

1.「承認欲求」という語の辞書的な意味

ウェブでこれの辞書的な意味を調べると「『他者から認められたい、自分を価値ある存在として認めたい』という願望」(weblio)や「他人から肯定的な評価を受けたい、否定的な評価をされたくない、自分を価値のある存在だと思いたい、という欲求」(goo)というのが一般的です。まぁ、そういう意味でこの語を理解していたので間違いはないといえますが、何か浅薄な感じなのでもう少し調べます。

するとこんな記事)があり、マズローの提唱する社会的欲求の一つ(自らの存在や能力を、他人から認められたいと望むこと。米国の心理学者・マズロー(1908~70年)が唱えた「欲求段階説」のうちのひとつの段階)だと書かれています。

:すべて表示されるまでにやや時間がかかります(三省堂"World-wise Web" by 小林肇-日本経済新聞社 用語幹事・専修大学協力講座講師)

 

2.マズローの「欲求五段階説」

(1)通説

このマズロー(Abraham Maslow)さんの「欲求五段階説」(正確には欲求が階層となる「欲求段階説("hierarchy of needs")」というのは、ウェブで「マズロー」と打つと様々なコンサルタントが記事を書いていて、「待ってましたっ!」とばかり、最下層から上へ「生理的欲求(Physiological needs)」「安全欲求(Safety needs)」「社会的欲求(Social needs / Love and belonging)」「承認欲求(Esteem needs)」「自己実現欲求(Self-actualization needs)」(注1)と並ぶ「5段ピラミッド図」を掲げています。(実際、この図は私も中学の保健体育か、倫理かなんかの授業で見た覚えがあります。)

しかし、批判(注2)も多く、実証科学というよりは動因、倫理的な仮説的意味合いが強く感じられます。

注1:マーズローの原典では「“Physiological Air, Water, Food, Shelter, Sleep, Sex”、“Safety and Security”、“Love & Belongingness”、“Self Esteem/ Esteem by Others”、“Self Actualization”」と書かれていた由。

注2:「1960年代から1970年代にかけて、マズローの欲求段階説に対する再現・実証研究が数多く行われたが、ほとんどの研究において、その科学的正当性を証明することはできなかった。『すべての人が』『あらゆる場面において』同一の欲求階層をたどるとは限らない、また性差や人種差を考慮すると異なるパターンが現れる、といった報告が相次ぎ、現在の行動科学では専門家がマズロー説を取り扱うことはほぼ皆無となっている。マズロー説の直感的わかりやすさから、一般社会や組織の管理者の間では未だ人口に膾炙しており、モチベーションの概説には役立つものの、学問的文脈では使用されるべきでないとの見解が大勢を占めている。現代の行動科学において用いられるモチベーションの枠組みとしては、たとえばエンパワーメントのピラミッドが用いられている。

 

(2)批判を踏まえた新解釈

因みにこの「往々にしてコンサルタントの好む(注1)5段ピラミッド図」については、聖路加大学学術情報リポジトリに「マズロー論」ともいえる興味深い論文が載っていましたので紹介します。(注2

注1:かくいう私も過去リスクコンサルタントとして仕事をしていましたのでこのような分かり易い説にありがちな使い方はよく分かります。

注2:「ところが,看護学のテキストに引用されている,三角形の基本的欲求の階層図は,どこの頁にも描かれていな かった。それどころかマズローは,基本的欲求の階層は不動のものではない,次の欲求が現れる前に,その前の欲求が 100%満たされなければならないという誤った印 象を与える恐れがあるといっていたのである。

<「マズローの基本的欲求の階層図への原典からの新解釈」における欲求関係図>

 

(3)マズロー欲求説における「承認欲求」に関わる訳語など

いずれにしても、「承認欲求(Needs for “Self Esteem/ Esteem by Others”)」は過去「自尊心」「尊重(への欲求、「尊重欲求」)」「承認と尊敬の欲求」「自尊心/他社による尊敬」「承認の欲求」等様々な訳語(解釈)がなされてきたようです。

 

3.「承認欲求」に関わる様々な見解

以上迄のウェブ調査を行う中で、なかなかにマズローや訳語に拘りがある方々が登場します。

 

例えばこの方他にこのような記事も)。私にはやや「定義づけに拘泥する感がつよく、言葉にとらわれすぎていないか?」という印象を持ってしまいました。

 

海外在住のこの方も「承認欲求」の語や概念に関心を持ち、自らの経験に即してこれを含め連続5記事書かれています。(

:最後に「...何回かにわたって書いていくつもりでしたがちょっと自分の中で何が知りたいのか、何が言いたいのかがわからなくなってきてしまったので、これでこのシリーズを 今回で一旦終わりにします。」「あ〜、すみません。ただの毒吐きブログのようになってしまいました。もう少し 冷静になってから『承認欲求』とか『自己顕示欲』はなんぞやと言うことを考えてみたいと思います。」ということで締めくくられていますが、それがこのテーマと関連しているようで興味深いです。

 

4.最後に~「承認欲求」?~

元々社会学や心理学に「ねっこ」を持つ私ですので、この問題についても興味を覚え、自分なりに考えてもみました。

 

「(自己)承認要求」は見てきたように、「自尊心」から「尊重、尊敬の欲求」まで、またはそれ以上に非常に広範な心理的反応を含む概念のようです。例えば...

 

(1)大会社の社長が、自分を「社長」と認識しなかった社員に不快に思う。

(2)クラスの地味な子が自分もクラスの一員であると認められたいと思う。

(3)大リーガーの選手が、記録を破られた際に破った選手に対して敵意を持ったことを恥じて、その選手を称賛する。

(4)反社会的集団(大会社)の非構成員(非正規従業員)が自分が構成員(正社員)の様に匂わす。

 

等々...私には全て「承認欲求」の形を変えた姿の様に感じます。何れも

 

誰に)私の(何を)承認してほしいと感じる欲求

 

には違いがないのですから。

 

誰に」が客観であれば「他人」ですが、客観は主観の反映として出来上がることを考えると「私自身」(主観)そのものも承認主体になりえます。(自己肯定感etc)また「何を」も権力や能力、富や名声、その他人が「価値を見つけることが出来るもの」である英語でいう"something"であれば、承認欲求を持つ主体の社会的地位、状況がその承認欲求の中身に密接に反映されるということが判るでしょう。→「(一国の権力を担う)日本の総理大臣がそうと認識されなかった場合」と「(何もない無力な)生徒がハブられた場合」との心理的反応に違いがあるでしょうか?

 

そう考えると、King Gnuの「ねっこ」の最初のフレーズにある「ただあなたにとって価値があればいい」(自身または他者にとって、自分の存在理由を認めてくれるようななにかがある)が将にこのような心理状態のように感じます。「私がただあなたにとって価値があればいい欲し、あなたにも認めて欲しい」状態ですね。

 

そういう意味で所謂「承認欲求」の対象範囲は非常に広いのですが、それが満たされなかった場合は共通しているように思えます。それは、

 

無視

 

される場合です。「日本の総理大臣が無視された場合」「生徒が無視された場合」は共通しているのではないでしょうか?これは「存在論的不安」(存在論的安心が脅かされている心理状態で、存在論的安心とは客観の礎である社会が確かに存在していて、そこに自分が立脚している確信)()とでもいうべきものではないでしょうか?

:イギリスの社会学者のアンソニー・キデンズが提唱した概念。

 

というのは、

 

本ブログを書くきっかけになったのが時々行くサイト(注)に「承認欲求というのは存在しない」という記事で、ありがちな「承認欲求」→「マズロウの欲求五段階説」というありきたりのアプローチではなく、

注:ものにより毒性がありますが、広範囲にわたり、内容も一癖ある面白そうなことが書かれています。

 

「仲間殺し」-何か「ミステリと言う勿れ」の整君を思い出しますね。

 

にその源泉を求めているからです。「存在論的不安」を感じた者は感じさせた者に対して排除または敵対行動をとることはありそうなことですよね?でも、この記事の論理展開で

 

「仲間殺し」の危険→回避策としての小集団内のゴシップ・悪口による危険情報の交換→現代のSNSによる巨大化

 

という着想は面白く、いじめ、ヘイトからデマゴギーや米大統領選、恐らくは戦争動機にまであてはめられそうですが、

 

何故「ゴシップ・悪口による危険情報の交換」という危険回避策から「集団内で構成要員が排他的行動、敵対行動をとるのか

 

また

 

何故それが(前記"Esteem needs"からSNSで拡散される自己アピール情報発信までを含む)「承認欲求」(の本質)なのか

 

がスーッと腑に落ちませんね。

 

いずれにしても、

 

「承認欲求」という言葉に拘泥することなしに、

 

人は無視されたくないし、その存在する理由(価値)を自分、ひいては他者に認めて欲しい

 

と感じることは極めて自然な心理的欲求で、

 

ねっこ

 

が証明しているように感じます。

 

今更何をほざいているのか?

という感じですが、皆様、明けましておめでとうございます。正月以降色々とあり、ご挨拶も遅れてしまいました。スミマセン。

 

今年は端からやや不調で、

 

(1)ぎっくり腰の予兆

(2)PCの不調(音声が出なくなる不具合)

 

があり、(1)についてはやや良くなっていますが、まだ少し安静が必要のようです。(2)については突然音声が出なくなり焦りました。RADEONのドライバーを再インストールして再立ち上げをしたら何とか回復しました。(尚、音声が出ない場合でも、イヤフォーンだと音を聞けますね。)

 

今年も恐らくネタ切れ問題

 

があると思いますが、頭を使わなくなるとどんどん馬鹿になるので無理して考えようと思っています。

 

本年もよろしくお願いいたします。

とうとう本当に大晦日になりました。

 

私も今年古希を迎え、気力、知力、体力の衰えと真摯に向き合うことが避けられなくなりました。又、今年は神さんのお義父さんも96で逝去され、人生の手仕舞いについて考えた年でもありました。

 

このブログについていえば、

 

 1月-WPFを学習し、動画(MediaElement、MediaPlayer)や音声(SAPI)を使う。

 2月-Python学習を開始(「Python日記」)

 3月-Windows 10 32bit PCを廃棄し、OthelloゲームをC#で組む。

 4月-「アミダクジ」(GhostLeg)をC#で組む。

 5月-Python学習の一応の終了と3DグラフィックとOpenGLへの没入

 6月-C++ベースのGlut_BCCを完成し、OpenTKを一通り使い、OpenGLの一応の学習終了。

 7月-ネタ欠乏に苦しみ始め、Daggerfallを始めたり、AIがらみで「じゃんけん」に興味を持つ。

 8月-手当たり次第にC++でリソースリスト、C#でリソースローティター等を組む。

 9月-腰痛が発生するも、C#でImageConverterを組み、トランプカード、麻雀等の基盤を考えるも、画像修正に挫ける。

10月-呆ける。

11月-再度カードゲームインフラに挑戦、画像修正も行い、「神経衰弱」を組む。麻雀ゲームインフラも取り組むが、謎の「トロイの木馬」現象が発生し、一応「盲牌」を組むもコード公表せず。そんなこんなで疲弊していて、突然ロジックを考えるようなC++のプログラムに郷愁を感じる。

12月-郷愁からC++で整数演算式の解釈プログラム、CALCを作成しコンソール、Windowsでテスト。その後C#版Calcも作成し公表。

 

という感じですか。

 

正直、年々衰えが感じられる

 

ようになってきましたが、皆様に支えられて3年半、ここまでやってこられました。

 

誠にありがとうございました。

 

来年もまだ少し、もう少し、私は脳味噌に鞭を打ってゆきたいと思いますので、

 

皆さまも、ご健勝、ご多幸のよい年を迎えられる

 

よう祈念いたします。

 

良いお年を。

 

ひょんに思いついた郷愁から始めたこのシリーズ、初めは忘れかけたC++躓き、今まで経験したことがない、C++のメモリー管理上のトラブルを経験し、何とかC++版を完成させ、C++版のCALCクラスを紹介し、序にC#版のCalcクラスも紹介したので、この両者の対決を企んでみます。勝負の例題は単に前にエラーテストを行った多重括弧式を3つ連ねたようなものです。

 

C++版のテストプログラムはザックリと書けば次のようになります。

【TestCalc.cpp】

//テストプログラム用のヘッダー
#include    <windows.h>    //定数CP_UTF8使用の為
#include    <conio.h>    //getch()使用の為
#include    <iostream>    //wcout、wcin使用の為
#include    <string>    //getline使用の為

using namespace std;

#include    "Calc.h"    //CALCクラス定義ヘッダーファイル

//////////////////////////////
// TestCalc.cpp
// Copyright 2024 by Ysama
//////////////////////////////

#include    <time.h>        //処理時間計測用

int wmain(int argc, wchar_t **argv) {

    std::wcin.imbue(locale("japanese"));    //wcinにロケールを設定
    std::wcout.imbue(locale("japanese"));    //wcoutにロケールを設定
 

    wchar_t *formula = L"( ( ( ( 125 * 467 + 2 * 98 - 34 ) * 3 - (256  + 32 / 8 ) / 4 ) * 213 + 612 / 2) - 218 * 46 - 42) + ( ( ( ( 125 * 467 + 2 * 98 - 34 ) * 3 - (256  + 32 / 8 ) / 4 ) * 213 + 612 / 2) - 218 * 46 - 42) - ( ( ( ( 125 * 467 + 2 * 98 - 34 ) * 3 - (256  + 32 / 8 ) / 4 ) * 213 + 612 / 2) - 218 * 46 - 42)";    //解説:これが例題です。
    int result;
    CALC calc(formula);

    //処理時間計測プログラム
    wcout << L">>> Calc Time Test Program for Embarcadero C++ <<<" << endl;
    clock_t start = clock();

    if(calc.TryCalc(result))
        wcout << L"演算式の答え:" << result << endl;
    else
        wcout << L"演算式が正しくありません。" << endl;

    clock_t end = clock();
    const double time = static_cast<double>(end - start) / CLOCKS_PER_SEC * 1000.0;
    printf("Time cosumed for processing is %lf[ms]\n", time);
    getch();
}

こんな簡単な式なので、ミリセカンドベースで0にしかなりませんでした。

 

一方、C#版は次のようになります。

【TestCalc.cs】

////////////////////////////////////////////////
// TestCalc.cs - A Test program for Calc class
////////////////////////////////////////////////

using System;
using Calc_Int;        //CalcクラスDLL

namespace TestCalc
{
    class SampleCalc
    {
        static void Main()
        {
            //処理時間計測用
            string f = "( ( ( ( 125 * 467 + 2 * 98 - 34 ) * 3 - (256  + 32 / 8 ) / 4 ) * 213 + 612 / 2) - 218 * 46 - 42) + ( ( ( ( 125 * 467 + 2 * 98 - 34 ) * 3 - (256  + 32 / 8 ) / 4 ) * 213 + 612 / 2) - 218 * 46 - 42) - ( ( ( ( 125 * 467 + 2 * 98 - 34 ) * 3 - (256  + 32 / 8 ) / 4 ) * 213 + 612 / 2) - 218 * 46 - 42)";    //解説:同じ例題です。
            Calc calc = new Calc(f);
            int sol = 0;
            //Stopwatchクラス生成
            var sw = new System.Diagnostics.Stopwatch();
            Console.WriteLine(">>> C# Calc class Time Test <<<");
            //計測開始
            sw.Start();
            if(calc.TryCalc(ref sol))
                Console.WriteLine("End result is: {0}", sol);
            else
                Console.WriteLine("Can't caluculate the formula.");
            //計測停止
            sw.Stop();
            TimeSpan ts = sw.Elapsed;
            Console.WriteLine("Time ellapsed {0} milliseconds.", sw.ElapsedMilliseconds);
            Console.ReadLine();
        }
    }
}

なーんと、ウィンドウズベースのグラフィック処理等では差がないCLIベースのC#では2ミリ秒という結果でした。CLIは中間言語インタープリターとなっていることもあり、単純な算術演算では矢張りネイティブプログラムにはやや劣るのかもしれませんね。

 

しかし、お願いですから(最近の殺伐とした世情でありがちな)

 

だからどうだっていうんだよ?

 

という突っ込みは止めていただき、

 

単純に好奇心で試してみて、「フーン」と言ってみる

 

という、素人プログラミングの原点のご紹介、とご理解いただければと思います。

 

無情にも中断させられた(1)からの続き。

 

        //////////////////////////////////////////
        //文字列の整数化関数
        //2、16または10進数文字列から整数値を返す
        //先頭詞:2進数は0B||0b、16進数は0X||0x
        //////////////////////////////////////////

        private bool TryParse(ref int sol, string str)
        {
            sol = 0;                            //solを初期化する
            int len = str.Length;                //strの長さ
            if(len == 0)                        //strが空文字列なら("")
                return false;                    //エラーとする
            //2進数(0Bまたは0b)文字列から整数値を返す
            if(str[0] == '0' && (str[1] == 'B' || str[1] == 'b'))
            {
                for(int i = 2; i < len; i++)
                {
                    if(str[i] < '0' || str[i] > '1')    //2進数以外の文字があればエラー
                        return false;
                    sol = sol * 2 + (str[i] - '0');
                }
            /*    if(!int.TryParse(str, NumberStyles.BinaryNumber, new CultureInfo("ja-JP"), out sol))
                    return false;
            >>> ChatGPTで確認 <<<
            「NumberStyles.BinaryNumberは、.NET 7以降で新たに導入された機能です。
            そのため、C# 5.0(.NET Framework 4.5に対応)では使用できず、
            コンパイル時に「定義がありません」というエラーが発生します。」
            */

            }
            //16進数(0Xまたは0x)文字列から整数値を返す
            else if(str[0] == '0' && (str[1] == 'X' || str[1] == 'x'))
            {
                if(!int.TryParse(str.Substring(2), NumberStyles.HexNumber, new CultureInfo("ja-JP"), out sol))
                    return false;
            /*    //オリジナルの文字列16進数変換コード
                for(int i = 2; i < len; i++)
                {
                    if(str[i] < '0' || (str[i] > '9' &&
                        str[i] < 'A') || (str[i] > 'F' &&
                        str[i] < 'a') || str[i] > 'f')
                        return false;                    //16進数以外の文字があればエラー
                    if(str[i] >= '0' && str[i] <= '9')
                        sol = sol * 16 + (str[i] - '0');
                    else if(str[i] >= 'A' && str[i] <= 'F')
                        sol = sol * 16 + (str[i] - 'A' + 10);
                    else
                        sol = sol * 16 + (str[i] - 'a' + 10);
                }
            */

            }
            //10進数文字列から整数値を返す
            else
            {
                if(!int.TryParse(str, NumberStyles.Number, new CultureInfo("ja-JP"), out sol))
                    return false;
            /*    //オリジナルの文字列10進数変換コード
                for(int i = 0; i < len; i++) {
                    if(str[i] < '0' || str[i] > '9')    //10進数以外の文字があればエラー
                        return false;
                    sol = sol * 10 + (str[i] - '0');
                }
            */

            }
            return true;
        }

        /////////////////////////////////////////////////////
        //(多重)括弧をスキップし、閉じ括弧のアドレスを返す
        /////////////////////////////////////////////////////

        private bool SkipBraces(string str, ref int ptr)
        {
            int len = str.Length;            //引数文字列の長さ
            if(str[ptr] != '(' ||            //文字列引数がL'('で始まらない場合又は
                ptr >= len)                    //ptrがstrの長さより大きい場合
                return false;                //エラー
            else
            {
                ptr++;                        //'('の次に進める
                while(ptr < len &&            //文字列が終了せず
                    str[ptr] != ')')        //')'でもなければ
                {
                    if(str[ptr] == '(')      
                    {
                        if(!SkipBraces(str, ref ptr))    //再帰的に処理する
                            return false;
                    }
                    ptr++;                //ptrを一つ進める
                }
                if(str[ptr] != ')')            //括弧が閉じられずに文字列が終了
                    return false;            //エラー
            }
            return true;                    //ptrは')'を指す
        }
    }
}

 

なお、取り敢えずこれをDLLにコンパイルして

テストするサンプルプログラムは次の通りです。

 

【Test.Calc.cs】

////////////////////////////////////////////////
// TestCalc.cs - A Test program for Calc class
////////////////////////////////////////////////

using System;
using Calc_Int;        //CalcクラスDLL

namespace TestCalc
{
    class SampleCalc
    {
        static void Main()
        {
            while(true)
            {
                string f = "";
                Console.Write("Input math expression (To end, press CR twice): ");
                f = Console.ReadLine();
                if(String.IsNullOrEmpty(f))
                    break;
                Calc calc = new Calc(f);
                Console.WriteLine("\r\nIs the expression: {0}, isn't it?", calc.Formula);
                int sol = 0;
                if(calc.TryCalc(ref sol))
                    Console.WriteLine("End result is: {0}", sol);
                else
                    Console.WriteLine("Can't caluculate the formula.");
            }
            Console.ReadLine();
        }
    }
}

 

次は最後にC++版とC#版のタイム競争の結果等をお伝えして、2024年の最終ブログにしようか、と思っています。