Библиотека программирования S-Lang — это программная библиотека для Unix , Windows , VMS , OS/2 и Mac OS X. Она предоставляет процедуры для встраивания интерпретатора для языка сценариев S-Lang и компоненты для облегчения создания текстовых приложений. [4] Последний класс функций включает процедуры для построения и управления раскладками клавиш, интерактивное средство редактирования строк, а также низкоуровневые и высокоуровневые функции управления экраном/терминалом. Она распространяется на условиях GNU General Public License .
Библиотека программирования S-Lang была начата в 1992 году Джоном Э. Дэвисом, который считал, что функции, написанные им для текстового редактора, могут быть полезны в других программах. [5] Самая ранняя версия библиотеки содержала процедуры ввода/вывода для взаимодействия с компьютерными терминалами и реализацию простого стекового интерпретатора с синтаксисом, подобным PostScript , который он разработал для использования в программе научного черчения. Текстовый редактор JED был первой программой, которая одновременно встраивала интерпретатор и использовала компоненты терминального ввода/вывода библиотеки.
Интерпретатор составляет большую часть библиотеки S-Lang, а также является местом, где происходит большая часть разработки. Хотя исходный синтаксис, поддерживаемый интерпретатором, напоминал PostScript, синтаксис эволюционировал в сторону большего сходства с C, с дополнительной поддержкой конструкций объектно-ориентированного стиля. Как отражение опыта Дэвиса в физике и профессионального интереса к научным вычислениям, язык изначально поддерживает множество векторизованных операций на основе массивов, подобных MATLAB и IDL . [6]
До версии 2.0 интерпретатор не был отдельной программой. Вместо этого Дэвис выступал за встраивание его в приложения, чтобы сделать их расширяемыми. Использование интерпретатора означало либо встраивание его в программу на языке C, либо использование его в контексте другого приложения (например, редактора JED ). Оболочка S-Lang, slsh, была демонстрационной программой, способной лишь на выполнение скриптов. Версия 2.0, выпущенная в 2005 году, сделала slsh интерактивным, и он превратился в самостоятельное приложение с рядом внешних модулей для использования. Таким образом, он стал интерпретатором S-Lang.
В середине 1990-х годов при портировании таблицы sc в библиотеку S-Lang Дэвис разработал средство управления экраном библиотеки. [ необходима цитата ] Этот компонент был разработан для оптимизации вывода на экран (путем минимизации количества символов, отправляемых на терминал) и предоставления простого способа поддержки различных терминалов с помощью дополнительного уровня абстракции между кодом приложения и терминалом. Программа чтения новостей slrn была первым приложением, которое в полной мере использовало этот интерфейс. [ необходима цитата ] С тех пор ряд других программ (например, Mutt [7] ) воспользовались этой функцией библиотеки, и она стала, возможно, наиболее используемым аспектом библиотеки, поскольку этот компонент считается альтернативой curses . [8] [9] Начиная с версии 2.0, процедуры управления экраном имели прозрачную поддержку UTF-8 .
#! /usr/bin/env slsh % Программа ниже решает следующую задачу: % Сортировка входного файла, состоящего из таких строк % % var1=23 other=14 ditto=23 fred=2частная переменная Ключи , Значения ; частная определить sort_fun ( i , j ) { переменная s , a , b ; s = Значения [ i ] - Значения [ j ]; ! if ( s ) return strcmp ( Ключи [ i ], Ключи [ j ]); return s ; }define slsh_main () { variable line , len , i , vals ; foreach line ( stdin ) { % Разделить строку на массив строк % % используя пробелы и = в качестве разделителя % line = strtok ( line , " \t\n=" ); len = length ( line ) / 2 ; if ( len == 0 ) continue ;% Четные элементы являются ключами, нечетные — значениями % [0::2] — это массив, содержащий индексы с шагом 2, % и создающий индексы от 0 до длины (строки) Keys = line [[ 0 :: 2 ]]; vals = line [[ 1 :: 2 ]];% Переменная объявлена выше Values = atoi ( vals );i = array_sort ([ 0 : len - 1 ], & sort_fun ); % Есть разные способы записи результата. Вот % быстрый способ, позволяющий избежать цикла. % Пустые скобки () обозначают объявление переменной и указывают, % что возвращаемое значение должно быть отброшено () = printf ( "%s\n" , strjoin ( Keys [ i ] + "=" + vals [ i ], " " )); } }