Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Организация данных. Символы. Строки.
Операторы доступа в SKILL Некоторые операторы доступа имеют характерный тип (вид). То есть синтаксис доступа к различным типам данных может быть одинаковым. Оператор “стрелка” (->) Применяется для доступа к свойствам ассоциативных таблиц, списков, структур, определяемых пользователем и др. Свойства, к которым осуществляется доступ этим оператором, всегда должны быть символами, значения которых могут быть любым типом данных SKILL.
Оператор “волнистая стрелка” (~>) Этот оператор является обобщением обычной стрелки. Кроме доступа непосредственно к объекту с помощью этого оператора также можно осуществить доступ к списку подобных объектов. В этом случае оператор «стрелка» будет применён к каждому элементу списка.
Символы ( Symbol) В SKILL символы играют ту же роль, что и переменные в С. Часто термины “символ” и “переменная” подменяют друг друга; при этом символы в SKILL могут быть использованы и для других целей. Каждый символ обладает следующими составляющими: § имя § значение § функциональное выражение § список свойств. За исключением имени, остальные свойства являются необязательными (могут быть пустыми). Не рекомендуется одновременно задавать символу значение и функциональное выражение.
Значение символа Значение символа может быть любого типа, включая тип символ.
Придание символу значения Чтобы придать символу значение используйте оператор (=). Пример x = 5 => 5 Получение значения символа Для получения значения символа необходимо сослаться на его имя. x=> 5
Использование оператора кавычки с символами Если вам необходимо работать непосредственно с символом, а не с его значением, используйте оператор кавычка (ед. ч.).
y = ' a => a Присвоение символа a переменной y.
Глобальные и локальные значения для символов SKILL использует символы и для глобальных, и для локальных переменных. Текущее значение символа доступно в любой момент времени и откуда угодно. SKILL управляет слотом значения символа транспарентно, так, как если бы он был стеком. Текущее значение символа – это верхушка стека. Придание символу значения изменяет только верхушку стека. Всякий раз, когда на входе выражение let или prog, система выставляет временное значение каждого символа списка локальных переменных в стек.
Функциональная связь символов Когда вы задаете функцию SKILL, система использует имя функции для определения символа, сопоставляемого с определением данной функции. Определение функции хранится в слоте функции. Если вы переопределяете функцию, используется тот же символ и предыдущее значение функции отменяется. В отличие от слота значения символа, слот символьной функции не зависит от применения выражений let или prog.
Строки( String) Строка – это некоторый набор символов. a = “ a b c” Логические и арифметические выражения. В Skill есть три типа простых выражений: константы, переменные и вызов функции. Константы, пример 123, 10,5 и «abc». Переменные, пример a, x my_var. Вызов функции (имя функции(аргументы)), пример f(a b c), abs(-567). Все эти простые выражения могут быть скомбинированы между собой с помощью операторов (например, a+b, f*d+5, x>y). Скобки разделяют имя функции и список ее аргументов, и также разделяют вложенные выражения. Арифметические и логические операторы. >, <, >=, <=, ==, !=, &&, ||, +, -, *, **,/, Предопределенные арифметические функции. add1(n) , sub1(n) , abs(n), exp(n), log(n), max(n1 n2), min(n1 n2), sqrt(n), sin(n) … Условные операторы . if( g_condition g_thenExpression [ g_elseExpression ] ) => g_result
if( g_condition then g_thenExpr1 ... [ else g_elseExpr1 ... ] ) => g_result
Пример: x = 2 if( (x > 5) 1 0) => 0 ; Returns 0 because x is less than 5. x = 7 if( (x > 5) then 1 else 0) => 1 ; Returns 1 because x is greater than 5. if( (x > 5) then println("x is greater than 5") x + 1 else print("x is less ") x - 1)
x is greater than 5 ; Printed if x was 7. => 8 ; Returned 8 if x was 7.
when( g_condition g_expr1 ... ) => g_result | nil Пример: x = -123 when( x < 0 println("x is negative") -x) => 123 ;Prints "x is negative" as side effect.
when( x >= 0 println("x is positive") x) => nil Функция case предлагает выполнение различных выражений при различных условиях: case( g_selectionExpr l_clause1 [ l_clause2 ... ] ) => g_ result | nil caseq быстрее чем case, синтаксис одинаковый.
Пример: nameofmonth = "February"
month = case( nameofmonth ("January" 1) ("February" 2) (t 'Other)) => 2 Операторы цикла . for( s_loopVar x_initialValue x_finalValue g_expr1 [ g_expr2 ... ] ) => t Пример: sum = 0 for( i 1 10 sum = sum + i printf("%d\n" sum)) ð t foreach( s_formalVar g_exprList g_expr1 [ g_expr2 ... ] ) => l_ valueList / l_ result используется для списков.
Пример: foreach ( x '(1 2 3 4) println(x))
1 ; Prints the numbers 1 through 4. 2 3 4 ð (1 2 3 4) Порты . Весь ввод/вывод в Skill осуществляется с помощью типа данных «порт» .Порт может быть открыт для чтения (входной порт) или для записи (выходной порт). В операционной системе Unix количество одновременно открытых портов ограничено, поэтому после использования порты всегда нужно освобождать (закрывать). Предопределенные порты Большинство функций ввода/вывода в языке Skill принимают порт в качестве необязательного аргумента. Если порт не указан, по умолчанию используются порты piport и poport в качестве входного и выходного портов соответственно. В таблице ниже находится список и назначение предопределённых портов. Данные порты все время открыты системой, поэтому их не надо открывать или закрывать.
Вывод данных. Skill предусматривает функции для форматированного и неформатированного вывода.
Неформатированный вывод.
print( g_ value [ p_ outputPort ] ) => nil Печатает объекты SKILL , используя формат по умолчанию для типов данных значений (вычислений). Например, строка символов заключается в двойные кавычки. g_ value - любой объект SKILL p_ outputPort - порт выхода для печати. По умолчанию - poport Всегда возвращает nil после того, как объект напечатан.
Пример: print ("hello") "hello" ð nil println(g_value [ p_outputPort ] ) => nil Печатает объекты SKILL, используя формат по умолчанию для типов данных значений, затем печатает символ, обозначающий конец текстовой строки и возвращающий печатающую головку принтера на начало (левый край) следующей строки. g_ value - любой объект SKILL p_ outputPort - порт выхода для печати. По умолчанию - poport Всегда возвращает nil после того, как объект напечатан.
Пример: for( i 1 3 println( "hello" )) "hello" "hello" "hello"
Форматированный вывод. Вы можете предопределить формат вывода с помощью соответствующего поля спецификации. Например, %5d означает, что будет напечатано целое число, которое имеет ширину 5 позиций. Если число начинается с 0, то те позиции которые не заняты заполняются 0 вместо пробелов. Форматы вывода:
printf( t_formatString [ g_arg1 ... ] ) => t Форматированный вывод в poport.
Пример: x = 197.9687 => 197.9687 printf ("The test measures %10.2f.\n" x) The test measures 197.97 sprintf( {s_Var | nil } t_formatString [ g_arg1 ... ] ) => t_ string Форматированный вывод в строку.
Пример: sprintf (s "Memorize %s number %d!" "transaction" 5) => "Memorize transaction number 5!"
s => "Memorize transaction number 5!"
p = outfile(sprintf(nil "test%d.out" 10)) => port:"test10.out" Ввод. evalstring( t_string [ s_langMode ] ) => g_value | nil Читает и вычисляет выражения, сохраненные в строке символов. t_ string- строка, содержащая Skill выражение, которое необходимо вычислить s_ langMode - данный аргумент должет быть типа символ. Доступные значения: ‘ils вычисляет строку в Skill++ ‘il вычисляет строку в Skill, данное значение установлено по умолчанию Возвращает вычисленное значение или nil если строка не прочитана.
Пример: evalstring ("1+2") => 3 The 1+2 infix notation is the same as (plus 1 2). evalstring ("cons('a '(b c))") => (a b c) car '(1 2 3) => 1 load( t_fileName [ t_password ] ) => t Открывает файл, неоднократно вызывает функцию lineread для чтения в файл. Сразу же после прочтения вычисляет каждую форму. Использует расширение файла для определения модели языка (.il для SKILL и .ils для SKILL). Закрывает файл, когда достигнут конец файла. Если не обнаружены ошибки, файл читается спокойно. Если load прервана нажатием клавиши Control- c, функция пропускает остаток загруженного файла. t_ fileName – имя файла, который необходимо загрузить t_ password – пароль, если файл зашифрованный Возвращает t, если файл загружен успешно.
Пример: load( "testfns.il") loadi( t_fileName [ t_password ] ) => t В отличии от функции load, функция loadi игнорирует ошибки, обнаруженные во время загрузки. Прежде чем остановиться, loadi печатает сообщение, указывая причину ошибки, и продолжает загрузку пока не дойдет до конца файла. Во всем остальном loadi подобна функции load.
Базы данных Все средства Cadence используют унифицированную базу данных DFII, это двоичная база данных, которая хранит данные, как объекты. Существует большое количество типов объектов, например: · rectangle; · terminal; · instance; · cellview и др. База данных DFII хранит как физическую, так и логическую информацию о проекте. Физическая информация, хранящаяся в объектах, - геометрические формы и IC топология. Логическая информация – цепи и схемы, которые могут существовать без соответствующей физической реализации. Для доступа к объекту необходимо использовать метку – идентификатор объекта, его ID. Каждый ID однозначно определяет объект базы данных и представлен специальным типом dbObject. Только внутренние программы базы данных могут создавать ID, и пользователь не может изменять их напрямую. Когда вы используете функцию, которая работает с объектами баз данных, необходимо указывать ID в качестве аргумента. Различные типы и классы объектов формируют иерархию классов. Когда количество отдельных типов объектов, использующих общие атрибуты, превышает некоторое число, создается класс объектов. Например, геометрические фигуры имеют атрибуты layer, purpose, bounding box.
Атрибуты объектов Каждый тип объектов имеет набор атрибутов, которые можно узнать, используя специальные для данного типа функции доступа. Существует три типа атрибутов: · обязательные – должны быть заданы во время создания объекта. Большинство атрибутов относится к этому типу. · необязательные – не являются обязательными для объекта. Данные атрибуты не нужно задавать во время создания объекта. Они могут быть добавлены в любое время. · вторичные – получаются из других атрибутов объекта. Вторичные атрибуты доступны пользователю только для чтения. Эти атрибуты играют большую роль в ускорении процесса расчетов.
Свойства объектов Свойства объектов имеют имена и значения, например целое, с плавающей точкой, строка. Объект может обладать произвольным количеством свойств. Свойства нужны для хранения различной информации.
|
Последнее изменение этой страницы: 2019-04-19; Просмотров: 179; Нарушение авторского права страницы