Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Специальные символы и операторы
SKILL использует многие арифметические операторы:
** - возведение в степень; * - умножение; / - деление; + - сложение(плюс); - - вычитание(минус); ++а - инкремент; --а - декремент; == - сравнение (равно); != - неравно = - присваивание;
В следующей таблице приведен список специальных символов и их значений в SKILL.
Замечание: Всем символам, не являющимся буквами цифрами и ( _ или ?) , которые используются в имени переменных(функций) должен предшествовать, символ обратной косой черты (\).
Специальные символы SKILL
Пример: If(( ( ] ; результат – все скобки закрыты
Пробел Пробел иногда приобретает смысловое значение, поэтому необходимо рассмотреть несколько синтаксических ограничений. При написании функции, имя функции пишется перед левой скобкой и пробел между ними недопустим. Например, f( a b c) и g() правильное название , но f ( a b c) и g () неверно. Также минус должен непосредственно предшествовать (без пробела) тому оператору, которому он принадлежит. Например, -1, - a, и -( a* b) правильная конструкция, но - 1, - a, и - ( a* b) неверно. Двойной минус (оператор вычитания) должен быть с обеих сторон окружен пробелами, либо пробелов ни там, ни там вообще быть не должно. Для избежания неясности один из методов должен быть использован постоянно. Например, a - b и a- b правильная конструкция для двойного минуса, но a - b неверно.
Комментарии SKILL допускает два типа комментариев. Один стиль – блочно-ориентированный, где для разделения используются знаки /* и */. Например: /* This s a bloc of comments comment line2 comment line3 etc. */ Второй стиль – линейно ориентирован. Точка с запятой (;) указывает, что вся информация до конца строки, после нее является комментарием.
Например, x = 1 ; comment ;comment line1 Как более простой, рекомендуется линейно – ориентированный стиль. Типы данных Skill поддерживает различные типы данных.
array ó a (одномерный массив, двумерный получается комбинированием); dbobject ó d (объект базы данных); flonum ó f (число с плавающей точкой); list ó l (связанный список); integer ó x (целое число); symbol ó s(символ); stringSymbol ó S(символ или строка символов); windowtype ó w(тип окна).
Масштабные коэффициенты
Тип данных Atom Atom – все объекты SKILL, кроме непустых листов. nil является одновременно и типом atom, и типом list. Другими словами это все скалярные типы данных. Но есть несколько основных nil – не верно (для логических операций) или пустой лист t – верно (для логических операций) unbound – переменная не была заданна Нельзя пользоваться этими обозначениями для имен переменных.
Тип данных строка Строка это последовательность символов, заключенных в двойные кавычки. Например: “acd” “123” Тип данных List SKILL list – это упорядоченный набор объектов данных SKILL. Структура данных list является основной в SKILL и может быть использована в самых различных ситуациях. Элементы, входящие в list, могут быть любого типа данных, а также могут быть переменными или другими листами. List может включать в себя набор элементов или быть пустым. Пустой list обозначается пустыми скобками “( )” или специальным словом nil. В любом случае list должен быть заключен в скобки. List может содержать несколько элементов типа list для формирования структур данных любой сложности. Задание List может осуществляться двумя способами: задание элементов списка указанием количества аргументов функции list: a = list(1 2 3) задание элементов списка поименно с помощью оператора ('): a = ‘(1 2 3) List может состоять из символов, быть пустым, или содержать другие списки. Примеры: a = ‘(1 a 3) a = ‘( ) a = ‘(‘(1 2)’(3 4)) Функции работы с list SKILL обладает широким набором функций для создания и управления list. Многие функции SKILL в качестве возвращаемого значения имеют list. SKILL может использовать несколько строк терминала для вывода list (глобальная переменная SKILL _itemsperline хранит соответствующее целое значение) append( list1 list2)-объединяет два списка. Результат применения функции append следует сохранять в переменную, иначе дальнейшая работа со списком будет невозможна.
Пример: append( ‘(1 2) ‘(3 4)) =>’(1 2 3 4) a=’(1 2) b=’(3 4) append(a b) =>’(1 2 3 4) oneList = '( 4 5 6 ) => ( 4 5 6 ) aList = '( 1 2 3 ) => ( 1 2 3 ) bList = append( oneList aList) => ( 4 5 6 1 2 3 )
append1( list arg )-добавляет новый элемент в конец списка.
Пример: append1( ‘(1 2 3) 4)) =>’(1 2 3 4) car( list )- возвращает первый элемент списка. Сам список остается прежним. Пример: b = ‘(1 2 3) a= car(b) => (1) a =>(1) z = ‘(1 2 3) =>(1 2 3) y = car(z) => 1 y =>1 z =>(1 2 3) car(nil) => nil cdr( list )-возвращает все элементы списка кроме первого(возвращает лист). Пример: cdr ( '(a b c) ) => (b c) z = '(1 2 3) cdr ( z ) => (2 3) Функции cdr car можно использовать вложенным способом
Пример: caaar ('(((1 2 3)(4 5 6))(7 8 9))) => 1 caaar - car( car( car( l_list))). caadr ('(((1 2 3)(4 5 6))(7 8 9))) => 7 car( car( cdr( l_list))). caar ('(((1 2 3)(4 5 6))(7 8 9))) => (1 2 3) car( car( l_list)). z = '(1 2 3) => (1 2 3) cadr ( z ) => 2 nth( x _ index 0 l _ list ) – возвращает n-ый элемент списка. Возвращает nil если x _ index 0 отрицательный, больше или равен числу элементов списка. Нумерация начинается с нуля. При n = 0 функция как и car возвращает первый элемент.
Пример: nth ( 1 '( a b c ) ) => b z = '(1 2 3) => (1 2 3) nth (2 z ) => 3 nth (3 z ) => nil nthelem( x _ index 1 l _ list )- возвращает n-ый элемент списка. Возвращает nil если x _ index 1 меньше или равен 0 и больше чем число элементов списка. Нумерация начинается с единицы. При n = 1 функция как и car возвращает первый элемент.
Пример: nthelm ( 1 ‘(a b c)) =>a z = ‘(1 2 3) nthelem (2 z) =>2 cons( element list )-добавляет на первое место списка один элемент. Результат применения функции cons следует сохранять в переменную, иначе дальнейшая работа со списком будет невозможна. Обычно результат передается в переменную, до этого хранившую исходный список. Пример: cons(1 nil) => (1) cons(‘a ‘(b c)) => (a b c) result = '( 2 3 ) => ( 2 3 ) result = cons( 1 result ) => ( 1 2 3 ) Следующий пример показывает как быстро можно создать список от 100 до 1. x=nil for( i 1 100 x = cons(i x)) => t x => (100 99 98 . . 2 1) Можно сделать x = reverse( x) =>(1 2 3 …100) nthcdr( x _ count l _ list ) применяет команду cdr к данному списку заданное количество раз.
Пример: nthcdr ( 3 ‘(a b c d)) =>(d) z = ‘(1 2 3) nthcdr (2 z) =>(3) nthcdr (-1 z) =>(nil 1 2 3) Если x _ count меньше 0, то возвращается результат выполнения cons ( nil l _ list ) tconc( l_ ptr g_ x) добавление элемента в конец списка. для создания новой tconc структуры(списка) l_ptr должна быть определена как nil. g_x элемент добавляемый в конец списка. В результате выполнения этой функции мы получаем список l_ptr с добавленным в конец элементом.
Пример: x = tconc ( nil 1) => x ((1) 1) tconc ( x 2 ) =>x ((1 2) 2) tconc ( x 3 ) =>x ((1 2 3) 3) x = car( x ) =>x (1 2 3) lconc( l_ tconc l_ list ) добавление списка к другому списку l_ tconc структура(лист), созданная с помощью команды tconc. l_ list список, добавляемый в конец структуры l_tconc. В результате выполнения этой функции мы получаем список l_tconc с добавленным в конец списком.
Пример: x = tconc(nil 1) => x ((1) 1) lconc ( x ‘(2 3 4)) => x ((1 2 3 4) 4) lconc ( x ‘(5)) => x ((1 2 3 4 5) 5) x = car( x ) => x (1 2 3 4 5) nconc( l_arg1 l_arg2 [l_arg3…] ) объединение нескольких списков
Пример: x = ‘( a b c) nconc ( x ‘(d)) => x (a b c d) nconc ( x ‘(e f g)) => x (a b c d e f g) данная функция быстрее чем append? Но медленнее чем tconc и lconc. Данная функция использует меньше памяти. length( lao _ arg ) – возвращает количество элементов списка или массива.
Пример: length( ‘(a b c d)) =>4 z = ‘(1 2 3) length( z ) =>3 Лекция 2. |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 167; Нарушение авторского права страницы