SenseTalk
Парадигма | Человеко-ориентированное программирование , Мультипарадигмальность , Объектно-ориентированное |
---|---|
Семья | Язык сценариев |
Разработано | Дуглас Саймонс |
Разработчик | Баклажан (программное обеспечение) |
Впервые появился | 1992 год |
Стабильная версия | 2.18
/ июнь 2024 г |
Дисциплина набора текста | Утка |
Лицензия | Собственный |
Расширения имен файлов |
|
Веб-сайт | www |
Под влиянием | |
xTalk , ГиперТок |
SenseTalk — это высокого уровня англоподобный язык сценариев из семейства XTalk , который поддерживает как процедурные, так и объектно-ориентированные парадигмы. Сценарии SenseTalk предназначены для чтения обычными людьми, в том числе теми, кто практически не имеет подготовки в программировании.
С этой целью SenseTalk включает ряд языковых элементов, которые обеспечивают функциональность, ориентированную на человеческие задачи, а не на базовое поведение машины. Например, чтобы проверить, делится ли количество на 3, сценарий может использовать выражение if quantity is divisible by 3 …
или if quantity is a multiple of 3 …
, с упором на читабельность и человеческую концепцию делимости. [1] Сравните это с более традиционными языками программирования (C, Java, Python и т. д.), где тот же тест обычно записывается как if (quantity % 3) == 0 …
, при этом основное внимание уделяется машинным операциям, необходимым для определения результата. [2]
Такое смещение акцента с лежащих в основе машинных вычислений на англоподобное описание поведения в человеческих терминах приводит к описанию SenseTalk как «языка программирования, ориентированного на людей». [3]
Отличительные характеристики
[ редактировать ]Поскольку SenseTalk является самопровозглашенным языком «человеко-ориентированного программирования», некоторые аспекты дизайна отличают его от других языков программирования и придают ему особый оттенок. Они варьируются от обыденных характеристик, таких как нечувствительность к регистру, до синтаксических элементов, улучшающих читаемость, до более тонких характеристик, таких как гибкие типы переменных, и расширенных функций, таких как единицы измерения и язык шаблонов SenseTalk.
Регистронезависимый
[ редактировать ]Ключевые слова SenseTalk и имена переменных нечувствительны к регистру. Это позволяет людям небрежно использовать заглавные буквы без каких-либо изменений в поведении.
Put 12 Into Apples
put 5 into Bananas
PUT "Total Pieces of Fruit: " & apples+bananas --> displays "Total Pieces of Fruit: 17"
Это также относится к именам свойств в списке свойств (имя SenseTalk для словаря или хеш-таблицы).
Put {Name:"Green", HexCode:"#00FF00"} into AColor
put aColor's name --> displays "Green"
put the HEXcode of acolor --> displays "#00FF00"
Кроме того, текстовые операции, включая сравнения, поиск и т. д., по умолчанию нечувствительны к регистру, хотя при необходимости их можно сделать чувствительными к регистру.
Set name to "McMaster"
put name contains "master" --> displays True (case is ignored)
put name contains "master" considering case --> displays False
Типы жидкостей
[ редактировать ]Помимо имен, нечувствительных к регистру, переменные в SenseTalk необычны и в некоторых других отношениях. Переменные не нуждаются в объявлении и не имеют типа. Переменная возникает при первом использовании, и ее тип зависит от типа значения, которое в ней хранится.
Эта гибкость выходит за рамки « утиной типизации », существующей в других языках, где данная переменная имеет тип, который устанавливается, когда переменной присваивается значение. В SenseTalk переменная считается «контейнером», который может содержать значения любого типа. Тип значения, которое содержит переменная, может измениться во время выполнения сценария, поэтому одна и та же переменная может сначала содержать число, затем строку, а затем список значений. Такая «гибкость типов» позволяет людям работать очень гибко, манипулируя значениями по своему желанию и рассматривая каждое значение в соответствии с тем, как оно используется в данном месте сценария.
Одним из следствий бестиповых переменных SenseTalk является отсутствие «перегруженных» операторов, то есть операторов, которые выполняют разные операции в зависимости от типа переменной, с которой они работают. Например, в некоторых языках +
Оператор будет выполнять сложение, когда он используется с числовыми операндами, и будет выполнять конкатенацию строк, когда он используется со строковыми операндами. В SenseTalk все операнды являются гибкими, поэтому для выполнения сложения необходим один оператор ( +
, который будет обрабатывать свои операнды как числа) и еще один оператор конкатенации строк ( &
, который будет обрабатывать свои операнды как строки).
Put 1 + 2 & 3 + 4 --> displays 37
В этом примере +
оператор имеет более высокий приоритет, чем &
оператор, поэтому выражение эквивалентно «(1 + 2) и (3 + 4)» или «3 и 7», что дает «37». Если для выполнения операции использовались круглые скобки &
сначала оператор, затем «1 + (2 и 3) + 4» станет 1 + «23» + 4, что даст результат 28.
Предопределенные переменные
[ редактировать ]SenseTalk включает сотни «предопределенных переменных». Это имена переменных, которые можно использовать как обычные переменные, но которые начинаются с предопределенного значения, если они используются без предварительного сохранения в них значения. Некоторые из предопределенных значений являются числами, например число «пи» или ноль. Многие из них являются специальными символами или символами, например euroSign , CopyrightSign или hotBeverage . А некоторые имеют другие типы значений, например jsonListFormat , который представляет собой список свойств, содержащий несколько пар ключ/значение, которые можно использовать для установки глобального свойства listFormat.
Put "Area of a circle with radius 5 is: " & pi * 5 squared
Любая переменная, которая не имеет предопределенного значения и которой еще не было явно присвоено значение, будет оцениваться либо как ее собственное имя, либо как пустая, в зависимости от контекста, в котором она используется. Это позволяет использовать слова без кавычек во многих случаях, когда в противном случае потребовались бы кавычки.
Put CookieCount --> displays "CookieCount"
Add 3 dozen to CookieCount --> treated as empty, or 0
put CookieCount --> displays 36
Единицы
[ редактировать ]SenseTalk включает полную поддержку множества различных типов единиц (длина, масса, продолжительность времени, объем, частота и т. д.). Числовые значения могут иметь связанные единицы измерения. Значения единиц преобразуются по мере необходимости при выполнении арифметических операций.
Put 5 yds + 2 ft --> displays 17 feet
Переменные могут содержать значения с единицами измерения. Единицы переносятся вместе со значением и применяются в последующих расчетах.
Put 5 yds into length
add 2 ft to length -- the value in length is converted to a compatible unit to perform the addition
put length --> displays 17 feet
put 42 inches into width
set area to length * width
put area --> displays 59.5 square feet
Также поддерживаются более сложные единицы измерения, такие как скорость (мили в час или метры в секунду) или ускорение (м/с^2).
Даты
[ редактировать ]SenseTalk распознает дату и время в самых разных форматах и поддерживает вычисления даты и времени.
Put "8:22" - "8:15" --> displays 420 seconds
Значения даты/времени могут храниться в переменных, а форматы поддерживаются посредством вычислений.
Put "March 3" + 34 days --> displays "April 6"
Put "2021-03-04" into nextDate
Add 4 weeks to nextDate
put nextDate --> displays "2021-04-01"
Add 4 months to nextDate
put nextDate --> displays “2021-08-01”
Выражения фрагментов
[ редактировать ]Выражения фрагментов SenseTalk происходят из его наследия как члена семейства XTalk языков , производного от HyperTalk . Выражения фрагментов позволяют работать с фрагментами текста, используя знакомые английские термины: символы, слова, элементы, строки. SenseTalk расширяет исходный синтаксис фрагментов и расширяет их использование за пределы текста, включая элементы в списке, а также байты в двоичных данных.
Put characters 7 to 11 of "Rumpelstiltskin" --> displays" stilt"
Put the first 3 chars of the second word of “book catalog” --> displays “cat”
Выражения фрагментов также можно использовать для изменения значений. В терминологии языка Xtalk фрагмент контейнера (например, переменная) также является контейнером, поэтому любая команда, изменяющая значение контейнера, также может использоваться для изменения фрагмента.
Put "Rumpelstiltskin" into funnyName
Put “bump” into characters 7 to 12 of funnyName
put funnyName --> displays “Rumpelbumpkin”
Файлы
[ редактировать ]SenseTalk включает команды для открытия, чтения и записи файлов. Текстовый файл можно рассматривать как контейнер (например, переменную), поэтому содержимое файла можно прочитать, просто поместив файл в переменную. Аналогично, запись файла можно выполнить, поместив в него переменную или другое выражение.
Put file "/tmp/addressList.txt" into addresses
Put "Miriam,219 Sparrow Ln,Freeburgh,MA" & return after addresses
Put addresses into file "/tmp/addressList.txt"
Поскольку файл является контейнером, любую команду, изменяющую контейнер, можно использовать непосредственно с файлом.
Put return & "Earlybird,12 Elm St,Vista,NM" after line 1 of file "/tmp/addressList.txt"
Базы данных
[ редактировать ]Доступ к записям в базе данных сложнее, чем чтение файла, но SenseTalk и здесь применяет концепцию контейнеров. Это позволяет подключиться к базе данных и обновить поле в конкретной записи с помощью очень небольшого количества кода.
Put {type:”ODBC”, DSN:”customers”, user:”admin”, password:”sEcrEt”} into custDB
Put table “subscriptions” of custDB into subs -- makes connection to a DB table
Add 12 months to expDate of the record of subs where CustNum is “83946-d” -- updates a value in a particular record
Язык шаблонов
[ редактировать ]«Язык шаблонов» SenseTalk [4] реализует регулярные выражения , используя удобочитаемый синтаксис, подобный английскому. В следующем примере создается шаблон для идентификации номера американского социального страхования (например, «999-99-9999»):
Set ssnPattern to <3 digits then dash then 2 digits then dash then 4 digits>
Узоры можно использовать по-разному.
if userEntry matches ssnPattern then set validSSN to true
put every occurrence of ssnPattern in file “userData” into ssnList
if clientInfo doesn’t contain ssnPattern then put “ <SSN missing>” after clientInfo
Язык шаблонов позволяет создавать шаблоны из других шаблонов. В этом примере используется предыдущий ssnPattern для определения шаблона, который позволит избежать совпадения в тех случаях, когда непосредственно предшествующий или следующий символ также является цифрой:
set isolatedSSN to <ssnPattern not preceded by digit, not followed by digit>
История
[ редактировать ]Язык SenseTalk впервые появился в 1992 году в качестве языка сценариев в HyperSense, приложении для создания мультимедиа для платформы NeXTSTEP , созданном по образцу HyperCard . В то время этот язык представлял собой не более чем копию языка HyperTalk компании HyperCard . Более амбициозное переосмысление и перепроектирование языка привело к появлению нынешнего языка: версия 0.02 была выпущена в качестве языка сценариев в Eggplant V1.0 в 2002 году. Язык продолжал расти и развиваться с такими улучшениями, как добавление поддержка:
- каждое выражение (аналогично «пониманию списков» на других языках) в версии 1.26 (2007 г.)
- древовидные структуры данных (встроенная поддержка XML) в версии 1.30 (2008 г.)
- итераторы в версии 1.36 (2008 г.)
- диапазоны в версии 1.38 (2009 г.)
- прямая поддержка HTTP и XML-RPC в версии 1.53 (2012 г.)
- Базы данных SQL в версии 1.63 (2013 г.)
- юниты в V1.67 (в 2014 г.)
- язык шаблонов SenseTalk (читаемые регулярные выражения) в версии 1.81 (2018 г.)
- форматы даты с читаемыми токенами в версии 1.91 (2019 г.)
- операторы if с несколькими регистрами в версии 2.00 (2020 г.)
- каждое выражение; использование каждого выражения для контейнеров в версии 2.04 (2021 г.)