出典(authority):フリー百科事典『ウィキペディア(Wikipedia)』「2016/07/08 21:51:16」(JST)
この項目では、プログラミング言語の一種であるLISPについて説明しています。
|
パラダイム | マルチパラダイム、関数型、手続き型、自己言及、メタ |
---|---|
登場時期 | 1958年 |
設計者 | ジョン・マッカーシー |
開発者 | スティーブ・ラッセル、ティモシー・P・ハート、マイク・レビン |
型付け | 強い動的型付け |
方言 | Arc、AutoLISP、Clojure、Common Lisp、Emacs Lisp、EuLisp、Franz Lisp、Hy、Interlisp、ISLISP、Le Lisp、LFE、Maclisp、MDL、newLISP、NIL、PicoLisp、 Portable Standard Lisp、Racket、RPL、Scheme、SKILL、Spice Lisp、T、XLISP、Lisp Machine Lisp |
影響を受けた言語 | IPL |
影響を与えた言語 | CLIPS、CLU、COWSEL、Dylan、Falcon、 Forth、Haskell、Io、Ioke、JavaScript、 |
LISPは、長い歴史を持ち、特徴的で完全に括弧で囲われたポーランド記法[1]によるプログラミング言語である。1958年にはじめて設計され、LISPは今日、広範囲に使用される高水準プログラミング言語の中でFORTRANに次いで2番目に古い[2]ものであるが、FORTRAN同様LISPは初期から非常に大きな変化を続けている。これまでに多数の方言が存在してきたが、今日最も広く知られるLISP方言は、Common LispとSchemeである。
元々、LISPは、アロンゾ・チャーチのラムダ計算表記法に影響を受け、コンピュータープログラムのための実用的かつ数学的な表記法として作られた。そして、すぐに人工知能研究に好まれるプログラミング言語になった。最初期のプログラミング言語として、LISPは計算機科学にて、木構造、ガベージコレクション、動的型付け、条件分岐、高階関数、再帰、セルフホスティング、コンパイラを含む多くのアイディアを切り開いた。[3]
LISPの名前は、「list processor」に由来している。リストはLISPの主要なデータ構造であり、LISPソースコードはそれ自体がリストからできている。 その結果、LISPプログラムはソースコードをデータとして操作することができ、プログラマーは、マクロ・システムで新しい構文やLISP埋め込みの新しいDSLを作成できる。
コードとデータの互換性は、LISPにそのすぐに認識できる構文を与える。すべてのプログラム・コードはS式または入れ子のリストとして書かれる。関数呼び出しまたは構文は先頭が関数または演算子の名前で、その続きが引数であるリストとして書かれる。具体的には、3つの引数を取る関数f
は、(f arg1 arg2 arg3)
として呼び出される。
LISPは1958年にジョン・マッカーシーがMITにいた期間に考案された。マッカーシーは1960年にACMの学会誌Communications of the ACMに「Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I」[4]という題名の論文(「パートII」が発表されることはなかった)を発表した。この論文において(それを言語とみなし純LISPとも言われるが)少数の単純な演算子と関数の表記法で、自分自身を評価するeval
関数(超循環評価器)を記述できることが示された。
1955年または1956年からはじまった、IPLは、最初の人工知能言語で、リスト処理や再帰などの多くの概念をすでに含んでいたが、その後すぐにそういった分野ではLISPが使われるようになった。
前述の超循環評価器はLISP自身で実装されているが、ひとたびLISP以外の言語で実装すればそれは実際にLISPを解釈実行できるインタプリタとなる。マッカーシーは自分の論文中にある評価器は単なる理論上の存在で、そのようにしてインタプリタを実装可能であると考えていなかった。しかし、マッカーシーのもとで大学院生であったスティーブ・ラッセルは論文を読んだ後、機械語でそれを実装してみせ、マッカーシーを驚かせた。そうしてLISPインタプリタが生まれた。
超循環評価器は、チューリングマシンにおける万能チューリングマシンに相当する。(当初LISPプログラムの表現法としていた)M式を、LISP自身が扱うデータ構造に変換したS式は、万能チューリングマシンの入力(テープの初期状態)として与えられるチューリングマシンの記述に相当する。マッカーシーはやはり、LISPプログラムのS式による表現はeval
を考えるための論文の中だけのものと考えており、実際のプログラムをS式で書くようになるとは考えていなかった。
LISPは当初IBM 704上で実装されたが、その計算機のレジスタを構成する部分の名前が、対を分解する関数car
[5]、cdr
[6]の名前の由来となった。爾来、ほとんどのLISPの方言において、car
とcdr
はそれぞれlistの最初の要素と、最初の要素以外を返す関数の名前となっている。
その発端からLISPは、人工知能研究のコミュニティ、特にPDP-10システムのユーザーには近しい存在であった。人工知能コミュニティでは、LISPはプログラミング言語の実装用言語としても用いられた。有名なAIシステムSHRDLUの実装言語のMicro Plannerは、MACLISPで実装されている。
また、1970年代には、LISPで実装されたREDUCEや、Macsyma等の数式処理システムの需要が高まるにつれ高速なLISPの処理系の需要も高まり、LISPを高速に処理するいわゆるLISPマシンの動機の一つとなった。LISPマシンは、タグアーキテクチャや、ハードウェアスタック等LISP向けのハードウェア機構により、型のディスパッチや関数呼出し、ガベージコレクションの高速化を実現した。
LISPは実装の容易さゆえに非常に多くの方言を生んだ。マクロを用いれば文法構造それ自体を拡張できるので、ある意味では利用者ごとに方言があるとさえいってよい。1970年代から1980年代にかけては、大きく分けてMACLISP系とInterlisp系の二つの主流が存在し、後のLISP方言に影響を与えている。
1980年代と1990年代には、たくさんのLISP方言を一つの言語に統合しようという努力がなされた。その結果として設計された新しい言語Common Lispは基本的にそれらの方言のスーパーセットであり、それらを置き換えることになった。1994年にANSIはCommon Lispの標準仕様「ANSI X3.226-1994 American National Standard for Programming Language Common LISP」を出版した。しかし、このときまでには、全盛期に比べるとLISPの市場は小さくなっていた。
一方で1970年代中ごろには、LISPベースでプログラミングに必要な言語機能を極限まで抽象化したSchemeが発生し、こちらも現在の主流の一つになっている。
LISPは現在でも広く使われている年代物の言語の一つである。
LISPは「式指向」の言語である。他の多くの言語とは違って、式と文は区別されず、すべてのコードとデータは式として書き下される。式が評価されたとき、それは値(または値のリスト)を生成する。式は他の式に埋め込める。
マッカーシーの1958年の論文では、2つのタイプの表現が導入されている。内部のデータ構造の表現であるS式(記号式、英: symbolic expression、sexp)と、S式を引数に取りS式を返す関数を表す、外部表現であるM式(メタ式、英: meta expression)である。マッカーシーは、S式はプログラムの処理対象のデータの表現に使い、LISPプログラムの表現にはM式を使った。S式によるプログラムの表現は論文の中のみのものと考えていた。しかし、S式で表現されたプログラムを評価するevalが実装され、S式で表現することでプログラムをプログラムで操作できるという利点があり、今日ではほとんどすべてのLISP言語でM式は使用されておらず、プログラムとデータの両方にS式を使用する。
LISPの用いる S式は括弧を大量に使用するため、批判を受けることもある。「LISP は 『lots of irritating superfluous parentheses』(過剰でいらいらさせる大量の括弧)に由来する」というジョークもある。しかし、S式による構文はLISPの能力を生み出してもいる。この構文は極めて正規化されているので、コンピュータによる操作が容易に行える。
式への依存が、LISPに優れた柔軟性を与えている。LISPの関数は、それ自身がリストとして書かれており、データとまったく同様に扱うことができる。LISPのプログラムは他のLISPプログラムを処理するように書くことができる。これは、メタプログラミングと呼ばれる。多くの LISP方言はこの機能をマクロシステムで活用しており、言語自身の機能をほとんど際限なく拡張することを可能にしている。
LISPでのリストは空白と括弧で区切られた要素で記述される。たとえば、
(1 2 "foo")
は1
, 2
, "foo"
の値を要素として持つ1つのリストである。これらの値は暗黙の型を持つ。これらは2つの整数と1つの文字列であるが、そのように宣言されている必要はない。空のリスト()
はnil
とも書ける。
現実の実装では、上記のリストを直接処理系に入力するとエラーが起きる。
CL-USER> (1 2 "foo")
; in: 1 2
; (1 2 "foo")
;
; caught ERROR:
; illegal function call
これは、上の(1 2 "foo")
は正しい式ではないからである。処理系の中で上のリストを表現したい場合は、クオート「'」を用いて'(1 2 "foo")
と書く必要がある。このことを解説するため、ここでLISPでの評価ルールについて述べる。
すべての式は前置記法のリストとして書かれる。リストの最初の要素はフォーム(関数、演算子、マクロ、特殊フォームのいずれか)の名前である。リストの残りは引数である。たとえば、関数list
はその引数をリストとして返す。つまり式
(list 1 2 "foo")
は評価されてリスト'(1 2 "foo")
を返す。このことを念頭に置いて、もう一度最初に挙げた式を振り返ると、
(1 2 "foo")
; 1 という関数名は存在しない
という仕組みでによりエラーが返されたことがわかるだろう。
もし引数のどれかが式であれば、それを含む式が評価される前にそれが再帰的に評価される。たとえば、
(list 1 2 (list 3 4))
はリスト(1 2 (3 4))
に評価される。つまり、3番目の引数はリストであり、リストはネストできるのである。
算術演算も同様に処理される。式
(+ 1 2 3 4)
は10に評価される。この式は中置記法では「」と等価である。
特殊形式(special form)は制御構造など、引数の位置にあるものを通常のようには評価しないような機能を提供する。たとえば、if
は3つの引数をとり、 第一引数の値が真なら第二引数に、偽なら第三引数に評価される。ここで真とはnil
以外、偽とはnil
のことである。したがって式
(if (evenp 5)
(list 1 2 "foo")
(list 3 4 "bar")
)
は(3 4 "bar")
に評価される。evenp
は、その第一引数が偶数であるときにtを、 奇数の時nilを返す関数である。5は奇数なので、第一引数(evenp 5)
を評価したif
は、その第三引数(list 3 4 "bar")
を返す。
関数の定義には、特殊形式lambda
によって
(lambda (x y) (+ x y))
のようにして、関数を表現する。この例は、ラムダ計算における (λx y.(x + y))
をLISPで表現したものである。
特殊形式defun
で関数を定義すると、関数に名前を付けて定義できる。defun
の引数は引数のリストと、関数として評価される式である。
以下の5つの関数と特殊形式、他にシンボルのnil
とt
、などがあれば自分自身を解釈実行できるevalを実装できる。このことはある意味で万能チューリングマシンと同様のことであると言える。
car
cdr
cons
eq
atom
cond
quote
define
(label)以下にいくつかのLISPのコード例を示す。これらは産業界における典型的なコードではないが、コンピュータサイエンスのコースで通常教えられる典型的なLISPコードである。
LISPの構文はそれ自身が再帰的定義に自然に適合している。それゆえ、再帰的に定義された集合を列挙するというような数学の問題をシンプルに表現できる。
以下の関数は引数の階乗に評価される。
(defun factorial (n)
(if (<= n 1)
1
(*n (factorial (- n 1)))
)
)
以下は別のやり方であり、末尾再帰になっているので末尾再帰の最適化を行う処理系であれば上記のバージョンよりも高速である。
(defun factorial (n &optional (acc 1))
(if (<= n 1)
acc
(factorial (- n 1) (* acc n))
)
)
再帰と対照的な概念である反復による計算の例として、Common Lispのloop
マクロを使った例を示す。
(defun factorial (n)
(loop for i from 1 to n
for fac = 1 then (* fac i)
finally (return fac)
)
)
loop
マクロはCommon Lisp標準の文法であり、手続き的なループを表現するための文法としてCommon Lisp以前のLISP方言から導入された。loop
はマクロなので、コンパイル時に式変形され、これが分解されて「普通の」LISPに翻訳されるものと考えてよい。
一方、このloop
マクロには欠点もあった。loop
は「ANSI標準」として取り入れられているため拡張することが許されていない点である。ここに、ライブラリiterate
が誕生した。通常の言語では、ライブラリとは手続き、関数、クラス定義などをまとめたものを指すが、LISPでは「新たな文法を与えてくれるライブラリ」というものが普通のライブラリと同様に存在する。
(defun factorial (n)
(iter (for i from 1 to n)
(for fac initially 1 then (* fac i))
(finally (return fac))
)
)
以下の関数は引数にリストをとり、そのリストの要素の順番を逆にしたものに評価される(LISPは実際には同じことを行うビルトイン関数を普通持っている)。
(defun reverse (l &optional acc)
(if (atom l)
acc
(reverse (cdr l) (cons (car l) acc))
)
)
以下を含む多種のオブジェクト指向あるいはモジュールがLISPの上に、あるいは併置して、あるいは組み込まれて設置されている。
CLOSは多重継承と多重ディスパッチ(マルチメソッド)の機能を持ち、強力なメソッド結合(method combination)のシステム(FIXME)を持つ。LISPを含めたCommon Lispは、公式に標準化された最初のオブジェクト指向言語である。
|
|
Lisp | |
---|---|
Classification and external resources | |
Specialty | Pediatrics |
ICD-10 | F80.8 |
ICD-9-CM | 307.9 |
[edit on Wikidata]
|
A lisp, also known as sigmatism, is a speech impediment in which a person misarticulates sibilants ([s], [z], [ts], [dz]), ([ʒ], [ʃ], [tʃ], [dʒ]).[1] These misarticulations often result in unclear speech.
Successful treatments have shown that causes are functional rather than physical; most lisps are caused by errors in tongue placement within the mouth. The most frequently discussed of these problems is tongue thrust in which the tongue protrudes beyond the front teeth.[3] This protrusion affects speech as well as swallowing and can lead to lisping. Ankyloglossia or tongue-tie can also be responsible for lisps in children. However it is unclear whether these deficiencies are caused by the tongue-tie itself or the muscle weakness following the correction of the tongue-tie.[4] Overbites and underbites may also contribute to non-lingual lisping. Temporary lisps can be caused by dental work, dental appliances such as dentures or retainers or by swollen or bruised tongues.
With an interdental lisp, the therapist teaches the child how to keep the tongue behind the two front incisors.[5]
One popular method of correcting articulation or lisp disorders is to isolate sounds and work on correcting the sound in isolation. The basic sound, or phoneme, is selected as a target for treatment. Typically the position of the sound within a word is considered and targeted. The sound appears in the beginning of the word, middle, or end of the word (initial, medial, or final).
Take for example, correction of an "S" sound (lisp). Most likely, a speech-language pathologist (SLP) would employ exercises to work on "Sssssss." Starting practice words would most likely consist of "S-initial" words such as "say, sun, soap, sip, sick, said, sail." According to this protocol, the SLP slowly increases the complexity of tasks (context of pronunciations) as the production of the sound improves. Examples of increased complexity could include saying words in phrases and sentences, saying longer multi-syllabic words, or increasing the tempo of pronunciation.
Using this method, the SLP achieves success with his/her student by targeting a sound in a phonetically consistent manner. Phonetic consistency means that a target sound is isolated at the smallest possible level (phoneme, phone, or allophone) and that the context of production must be consistent. Consistency is critical, because factors such as the position within the word, grouping with other sounds (vowels or consonants), and the complexity all may affect production.
Another popular method for treating a lisp is using specially designed devices that go in the mouth to provide a tactile cue of exactly where the tongue should be positioned when saying the "S" sound. This tactile feedback has been shown to correct lisp errors twice as fast as traditional therapy.
Using either or both methods, the repetition of consistent contexts allows the student to align all the necessary processes required to properly produce language; language skills (ability to formulate correct sounds in the brain: What sounds do I need to make?), motor planning (voicing and jaw and tongue movements: How do I produce the sound?), and auditory processing (receptive feedback: Was the sound produced correctly? Do I need to correct?). A student with an articulation or lisp disorder has a deficiency in one or more of these areas. To correct the deficiency, adjustments have to be made in one or more of these processes. The process to correct it is more often than not, trial and error. With so many factors, however, isolating the variables (the sound) is imperative to getting to the end result faster.
A phonetically consistent treatment strategy means practicing the same thing over and over. What is practiced is consistent and does not change. The words might change, but the phoneme and its positioning is the same (say, sip, sill, soap, …). Thus, successful correction of the disorder is found in manipulating or changing the other factors involved with speech production (tongue positioning, cerebral processing, etc.). Once a successful result (speech) is achieved, then consistent practice becomes essential to reinforcing correct productions.
When the difficult sound is mastered, the child will then learn to say the sound in syllables, then words, then phrases and then sentences. When a child can speak a whole sentence without lisping, attention is then focused on making correct sounds throughout natural conversation. Towards the end of the course of therapy, the child will be taught how to monitor his or her own speech, and how to correct as necessary. Speech therapy can sometimes fix the problem, but however in some cases speech therapy fails to work.
Permanent lisps can often be corrected through extensive oral operations. Often, when a patient has extreme overbite, causing a lisp, having orthodontic braces and rubber bands for an extended period of time will correct the issue, and resolve the lisp.
,
|
|
全文を閲覧するには購読必要です。 To read the full text you will need to subscribe.
拡張検索 | 「lispro」 |
.