(2002 елның май аендагы төзәтмә)
(Бу мәкалә LL1 хат алышу исемлегендәге кайбер сорауларга җавап рәвешендә барлыкка килде. Хәзер ул Revenge of the Nerds составына кертелгән.)
Маккарти 1950 еллар ахырында Lisp'ны эшләгәндә, ул булган телләрдән, беренче чиратта иң мөһиме булган Fortran'нан бөтенләй башка, яңа бер адым иде.
Lisp тугыз яңа фикерне гәүдәләндерде:
1. Шартлы конструкцияләр. Шартлы конструкция — бу if-then-else конструкциясе. Хәзер без моңа гадәти нәрсәгә кебек карыйбыз. Алар Lisp'ны эшләү барышында Маккарти тарафыннан уйлап табылган. (Ул вакытта Fortran'да җиһазның (hardware) тармаклану инструкциясенә нигезләнгән шартлы goto гына булган.) Algol комитетында булган Маккарти шартлы конструкцияләрне Algol'га кертте, һәм шуннан алар башка күпчелек телләргә таралды.
2. Функцияләр тибы. Lisp'та функцияләр беренче класс объектлары (first-class objects) булып тора — алар бөтен саннар, юллар һәм башкалар кебек үк гади мәгълүмат тибы: аларның үз литерал күренеше бар, үзгәрешлеләрдә саклана, аргумент буларак тапшырыла ала һәм башкалар.
3. Рекурсия. Әлбәттә, математик төшенчә буларак рекурсия Lisp'ка кадәр дә булган, ләкин Lisp аны хуплаган беренче программалаштыру теле иде. (Бу, асылда, функцияләрне беренче класс объектлары итүдән үзеннән-үзе килеп чыга.)
4. Үзгәрешлеләрнең яңа концепциясе. Lisp'та барлык үзгәрешлеләр дә, асылда, күрсәткечләр (pointers) булып тора. Типлар үзгәрешлеләргә түгел, ә кыйммәтләргә карый, һәм үзгәрешлеләрне билгеләү яки бәйләү — алар күрсәткән нәрсәне түгел, ә күрсәткечләрне күчерүне аңлата.
5. Чүп җыю (Garbage-collection).
6. Гыйбарәләрдән (expressions) торган программалар. Lisp программалары — һәрберсе кыйммәт кайтара торган гыйбарәләр агачы. (Кайбер Lisp юрамаларында гыйбарәләр берничә кыйммәт кайтара ала.) Бу гыйбарәләр һәм инструкцияләр (statements) арасында аерма куйган Fortran'нан һәм аннан соң килгән күпчелек телләрдән аерылып тора.
Fortran'да бу аерманың булуы табигый иде, чөнки (кертү перфокарталар ярдәмендә башкарылган тел өчен гаҗәп түгел) тел юлларга юнәлтелгән иде. Сез инструкцияләрне бер-берсе эченә урнаштыра алмый идегез. Шуңа күрә, математика эшләсен өчен гыйбарәләр кирәк булса да, башка бернәрсәнең дә кыйммәт кайтаруында мәгънә юк иде, чөнки ул кыйммәтне кабул итә алырлык бернәрсә дә булмаган.
Бу чикләү блок-структуралы телләр барлыкка килү белән юкка чыкты, ләкин ул вакытта инде соң иде. Гыйбарәләр һәм инструкцияләр арасындагы аерма ныклап урнашты. Ул Fortran'нан Algol'га күчте, ә аннан — икесенең дә варисларына таралды.
Тел тулысынча гыйбарәләрдән торгач, сез гыйбарәләрне үзегез теләгәнчә төзи аласыз. Сез болай дип тә яза аласыз (Arc синтаксисын кулланып):
(if foo (= x 1) (= x 2))
яки болай:
(= x (if foo 1 2))
7. Символ тибы. Символлар юллардан шуның белән аерыла: тигезлекне күрсәткечне чагыштырып кына тикшереп була.
8. Код өчен нотация — символлар агачын куллану.
9. Бөтен тел һәрвакыт кулланылышта. Уку вакыты (read-time), компиляция вакыты (compile-time) һәм башкару вакыты (runtime) арасында реаль аерма юк. Сез уку вакытында кодны компиляцияли яки башкара аласыз, компиляция вакытында кодны укый яки башкара аласыз, һәм башкару вакытында кодны укый яки компиляцияли аласыз.
Уку вакытында кодны башкару кулланучыларга Lisp'ның синтаксисын яңадан программалаштырырга мөмкинлек бирә; компиляция вакытында кодны башкару — макросларның нигезе; башкару вакытында компиляцияләү — Emacs кебек программаларда Lisp'ны киңәйтү теле буларак куллануның нигезе; ә башкару вакытында уку программаларга s-гыйбарәләр (s-expressions) ярдәмендә аралашырга мөмкинлек бирә (бу фикер соңрак XML буларак яңадан уйлап табылды).
Lisp яңа гына уйлап табылганда, бу фикерләрнең барысы да гадәти программалаштыру практикасыннан бик ерак иде, ә ул практика, нигездә, 1950 еллар ахырындагы булган җиһазлар мөмкинлеге белән билгеләнә иде.
Вакыт узу белән, популяр телләр чылбырында гәүдәләнгән төп юнәлеш теле әкренләп Lisp ягына үсеш алды. 1–5 пунктлар хәзер киң таралган. 6 пункт төп агымда (mainstream) күренә башлады. Python'да 7 пунктның бер төре бар, гәрчә моның өчен махсус синтаксис булмаса да. 8 пункт (9 белән бергә) — Lisp макросларын мөмкин иткән нәрсә — әлегә кадәр Lisp өчен генә хас булып кала; бәлки, моның сәбәбе (a) аңа шул җәяләр яки шундый ук начар бүтән нәрсә кирәк булганлыктандыр, һәм (б) әгәр сез бу соңгы өстәмә көчне кушсагыз, сез инде яңа тел уйлап таптым дип әйтә алмыйсыз, бары тик Lisp'ның яңа диалектын эшләдем дип кенә әйтә аласыз ; -)
Бүгенге программачылар өчен файдалы булса да, Lisp'ны башка телләр тарафыннан очраклы кабул ителгән җайлашулардан аермасы күзлегеннән тасвирлау сәер. Маккарти бу турыда болай уйламагандыр, мөгаен. Lisp Fortran хаталарын төзәтү өчен эшләнмәгән; ул күбрәк исәпләүләрне аксиомалаштыру омтылышының өстәмә продукты буларак барлыкка килгән.