Кіріспе
Emacs-тің негізгі іске асыру және кеңейту тілі ретінде қолданылатын Lisp диалектісі. Emacs Lisp – Emacs-тың (көбінесе GNU Emacs және XEmacs-пен байланысты мәтін редакторы отбасысы) скрипт тілі ретінде пайдаланылатын Lisp бағдарламалау тілінің диалектісі. Ол Emacs-қа енгізілген өңдеу функцияларының көп бөлігін іске асыру үшін қолданылады, ал қалғаны C тілінде, Lisp интерпретаторы сияқты жазылған. Emacs Lisp-ті Elisp деп те атайды, бірақ сол атпен байланысты емес басқа Lisp диалектілері де бар. Emacs қолданушылары Emacs-ты баптау және кеңейту үшін әдетте Emacs Lisp кодын жазады. Emacs Lisp-те жазылған Customize жүйесі қолданушыға параметрлерді орнатуға және олардың Emacs сессиясындағы әсерін алдын ала қарауға мүмкіндік беретін параметрлер беттерін ұсынады. Қолданушы өзгерістерін сақтағанда, Customize қажетті Emacs Lisp кодын қолданушының конфигурациялық файлына жазады, оны тек Customize пайдаланатын арнайы файлға орнатуға болады, бұл қолданушының өзінің файлына өзгерістер енгізу қаупін болдырмау үшін жасалады. Emacs Lisp, Unix Bourne shell немесе Perl сияқты, Emacs-ты пакеттік режимде шақыру арқылы скрипт тілі ретінде де жұмыс істей алады. Осылайша оны командалық жолдан немесе орындалатын файл арқылы шақыруға болады, және оның буферлер мен қозғалыс командалары сияқты өңдеу функциялары бағдарламаға әдеттегі режимдегідей қолжетімді болады. Emacs пакеттік режимде іске қосылғанда пайдаланушы интерфейсі көрсетілмейді; ол тек берілген скриптті орындайды және скрипттен шығарылған мәліметтерді көрсетеді.
Emacs Lisp is a dialect of the Lisp programming language used as a scripting language by Emacs (a text editor family most commonly associated with GNU Emacs and XEmacs). It is used for implementing most of the editing functionality built into Emacs, the remainder being written in C, as is the Lisp interpreter. Emacs Lisp is also termed Elisp, although there are also older, unrelated Lisp dialects with that name. Users of Emacs commonly write Emacs Lisp code to customize and extend Emacs. Itself written in Emacs Lisp, Customize provides a set of preferences pages allowing the user to set options and preview their effect in the running Emacs session. When the user saves their changes, Customize simply writes the necessary Emacs Lisp code to the user's config file, which can be set to a special file that only Customize uses, to avoid the possibility of altering the user's own file. Emacs Lisp can also function as a scripting language, much like the Unix Bourne shell or Perl, by calling Emacs in batch mode. In this way it may be called from the command line or via an executable file, and its editing functions, such as buffers and movement commands are available to the program just as in the normal mode. No user interface is presented when Emacs is started in batch mode; it simply executes the passed in script and exits, displaying any output from the script.
Басқа Lisp диалектілерімен салыстырғанда
Emacs Lisp Maclisp-ке ең жақын, кейін Common Lisp-тің де ықпалы болды. Ол императивті және функционалдық бағдарламалау әдістерін қолдайды. Lisp, EINE және ZWEI сияқты Emacs туындылары үшін әдепкі кеңейту тілі болды. Ричард Столлман Gosling Emacs-ті GNU Emacs-ке бөліп алғанда, оның қуатты мүмкіндіктері, соның ішінде функцияларды дерек ретінде қарау қабілетіне байланысты Lisp-ті кеңейту тілі ретінде таңдады. Common Lisp стандарты әлі қалыптаспаған болса да, сол кезде Scheme болды, бірақ Сталлман оны жұмыс станцияларындағы нашар өнімділігіне байланысты (Emacs-тің дәстүрлі ортасы болған мини-компьютерлермен салыстырғанда) пайдаланудан бас тартты және оңайрақ оңтайландырылатын диалектті жасауды қалады. Emacs-те қолданылатын Lisp диалектісі, қосымша бағдарламалау үшін қолданылатын Common Lisp және Scheme диалектілерінен айқын түрде ерекшеленеді. Emacs Lisp-тің ерекше қасиеті – әдепкі бойынша лексикалық емес, динамикалық ауқымды пайдалануы. Яғни, функция оны шақырған ауқымдағы жергілікті айнымалыларға сілтеме жасай алады, бірақ оны анықтаған ауқымда емес. Жақында лексикалық ауқымды пайдалану үшін кодты жаңарту жөніндегі жұмыстар жүргізілуде, себептері төменде көрсетілген.
Бастапқы код
Emacs Lisp коды файлдық жүйелерде қарапайым мәтіндік файлдар түрінде сақталады, әдетте файл атауының қосымшасы ".el" болып жазылады. Пайдаланушының бастапқы файлы (init file) ерекше жағдай болып табылады, ол көбінесе ".emacs" деп аталады, бірақ ол кез келген Emacs Lisp коды сияқты орындалады. 1990 жылдардың ортасынан бері Emacs сонымен қатар ~/.emacs.el және ~/.emacs.d/init.el файлдарын да жүктейді. Сонымен қатар, пайдаланушылар кез келген файлды командалық жол арқылы конфигурациялық файл ретінде жүктеуге немесе конфигурациялық файлдың жүктелмеуін нақты көрсетуге болады. Файлдар жүктелген кезде, Emacs бағдарламасының интерпретатор бөлігі функциялар мен айнымалыларды оқып, талдайды және оларды жадта сақтайды. Олар басқа өңдеу функцияларына және пайдаланушы командаларына қолжетімді болады. Функциялар мен айнымалыларды редакторды қайта іске қоспай немесе конфигурациялық файлды қайта жүктемей еркін өзгертуге және қайта анықтауға болады. Уақыт пен жадты үнемдеу үшін Emacs функционалының көп бөлігі тек қажет болғанда ғана жүктеледі. Emacs-пен бірге келетін қосымша мүмкіндіктердің әрбір жиынтығы Emacs кодының жиынтығы арқылы іске асырылады, бұл пакет немесе кітапхана деп аталады. Мысалы, бағдарламаның бастапқы кодындағы түйін сөздерді бөліп көрсетуге арналған кітапхана және тетрис ойынын ойнауға арналған кітапхана бар. Әрбір кітапхана бір немесе бірнеше Emacs Lisp бастапқы файлдарын пайдалана отырып іске асырылады. Кітапханалар өздерінің жұмысын іске қосу және басқару үшін бір немесе бірнеше негізгі режимдерді анықтай алады. Emacs әзірлеушілері кейбір функцияларды C тілінде жазады. Бұл примитивтер, сондай-ақ кіріктірілген функциялар немесе кіші функциялар деп те аталады. Примитивтерді Lisp кодынан шақыруға болады, бірақ оларды тек C бастапқы файлдарын өңдеу және қайта компиляциялау арқылы өзгертуге болады. GNU Emacs-та примитивтер сыртқы кітапханалар ретінде қолжетімді емес; олар Emacs орындалатын файлының бөлігі болып табылады. XEmacs-та мұндай примитивтерді орындау кезінде жүктеу мүмкін, бұл операциялық жүйенің динамикалық байланыс мүмкіндіктерін пайдалану арқылы жүзеге асырылады. Функциялар примитивтер ретінде жазылуы мүмкін, себебі оларға Emacs Lisp-тен басқа қолжетімді емес сыртқы деректер мен кітапханаларға қол жеткізу қажет немесе C мен Emacs Lisp-тің салыстырмалы жылдамдығы маңызды айырмашылықты тудыратын жиілікпен шақырылады. Дегенмен, C кодындағы қателер сегментациялық бұзушылықтарға немесе редактордың құлауына әкелетін одан да күрделі қателерге оңай әкелуі мүмкін, және Emacs Lisp қоқыс жинаушысымен дұрыс әрекеттесетін C кодын жазу қатеге бейім, сондықтан примитивтер ретінде іске асырылатын функциялардың саны қажетті ең төменгі деңгейде ұсталады.
Байт коды
Байттық компиляция Emacs Lisp кодын жылдам орындауға мүмкіндік береді. Emacs құрамында Emacs Lisp бастапқы файлдарын байт-код деп аталатын ерекше форматқа аударатын компилятор бар. Emacs Lisp байт-код файлдарының атаулары ".elc" жұрнағымен аяқталады. Бастапқы файлдармен салыстырғанда, байт-код файлдары жылдамырақ жүктеледі және орындалады, дискіде аз орын алады және жүктелу кезінде аз жадты пайдаланады. Байт-код примитивтерге қарағанда бәрібір баяу жұмыс істейді, бірақ байт-код ретінде жүктелген функцияларды өзгерту және қайта жүктеу оңай. Сонымен қатар, байт-код файлдары платформадан тәуелсіз. Emacs-пен бірге таратылатын стандартты Emacs Lisp коды байт-код ретінде жүктеледі, бірақ пайдаланушының анықтамасы үшін сәйкес бастапқы файлдар да әдетте беріледі. Пайдаланушы ұсынған кеңейтулер әдетте байттық компиляциядан өткізілмейді, себебі олар үлкен де емес, күрделі есептеулерді де қажет етпейді.
Тіл ерекшеліктері
"cl lib" пакеті Common Lisp-тің үлкен бөлігін іске асырады. Бұл пакет бұрынғы "cl" пакетін ауыстырады, ол қолданыстағы Emacs Lisp функцияларының анықтамаларын Common Lisp-тегі анықтамалармен алмастырып, оларды ұқсас ететін еді. "cl lib" пакеті керісінше, Emacs Lisp стильдік талаптарына сәйкес келеді және өзі анықтаған әрбір функция мен макроның алдына "cl" префиксін қосады (мысалы, cl defun, ол кіріктірілген defun атауымен қақтығысқа түспейді), осылайша "cl" пакеті жүктелген кезде болатын күтпеген мінез-құлық өзгерістерінен сақтайды. Emacs Lisp (кейбір басқа Lisp нұсқаларынан өзгеше) құйрық шақыруларын оңтайландырмайды. Бұл мүмкіндік болмағандықтан, құйрық рекурсиясы ақырында стек асығуына (stack overflow) алып келуі мүмкін. apel кітапханасы полисилаби платформасы көмегімен портативті Emacs Lisp кодын жазуға көмектеседі. Emacs Lisp, Common Lisp сияқты, Lisp 2 болып табылады, яғни оның функциялар атау кеңістігі басқа айнымалылар үшін қолданылатын атау кеңістігінен бөлек.
Динамикалық ауқымынан лексикалық ауқымына
MacLisp сияқты, Emacs Lisp динамикалық ауқымды қолданады, 24 нұсқасынан бастап статикалық (немесе лексикалық) опцияны ұсынады. Оны файлдың жергілікті айнымалысының лексикалық байланысын орнату арқылы қосуға болады. Бұл опция қосылғанға дейін, (қазір ескірген) "cl" пакетінен лексикалық let макросын пайдалану арқылы тиімді лексикалық ауқымды қамтамасыз етуге болады. Динамикалық ауқымда, егер бағдарламашы функция ауқымында айнымалыны жарияласа, ол сол функция ішінде шақырылған кіші программаларға қолжетімді болады. Бастапқыда бұл оңтайландыру ретінде қарастырылды; лексикалық ауқым әлі де сирек кездесетін және оның өнімділігі белгісіз болды. Компьютер ғалымы Олин Шиверстің айтуынша, "Мен RMS-тен Emacs Lisp-ті іске асырып жатқанда, неге динамикалық ауқымды қолданғанын сұрадым, ал ол лексикалық ауқым тым тиімсіз дейтін." Динамикалық ауқым сонымен қатар пайдаланушының өзгертулеріне көбірек икемділік беру үшін де жасалды. Дегенмен, динамикалық ауқымның бірнеше кемшіліктері бар. Біріншіден, ол әртүрлі функциялардағы айнымалылардың күтпеген өзара әрекеттесуінен туындаған үлкен бағдарламалардағы қателерге әкелуі мүмкін. Екіншіден, динамикалық ауқымда айнымалыларға қол жеткізу, әдетте, лексикалық ауқымдағыдан гөрі баяу болады.