Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
skill / Лбы skill / Лекция3_м.doc
Скачиваний:
51
Добавлен:
05.06.2015
Размер:
130.56 Кб
Скачать

Лекция 3.

Логические и арифметические выражения.

В 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

Функция unless аналогична when, но выполняет выражения для всех условий, кроме указанных:

unless( g_condition g_expr1 ... ) => g_result | nil

Пример:

x = -123

unless( x >= 0 println("x is negative") -x)

=> 123 ;Prints "x is negative" as side effect.

unless( 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 в качестве входного и выходного портов соответственно. В таблице ниже находится список и назначение предопределённых портов. Данные порты все время открыты системой, поэтому их не надо открывать или закрывать.

имя

применение

piport

Стандартный порт ввода, аналог stdin в C

poport

Стандартный порт вывода, аналог stdout в C

errport

Выходной порт для вывода сообщений об ошибках, аналог stderr в С

ptport

Выходной порт для вывода сообщений об ошибках, аналог stderr в С

woport

Выходной порт для вывода предупреждений, аналог stdout в С

Функции работы с файлами.

infile(S_fileName) => p_inport | nil

Открывает готовый входящий порт для чтения файла. Всегда помни о необходимости закрыть сделанный порт. Имя файла может быть указано как абсолютный путь или относительный путь.

В последнем случае, используется текущий путь SKILL, если не установлено nil. Заметьте, что надежно закрепленный путь текущей директории для примера

, ./, ../, или ../../.., и т.д., не считается относительным путем.

Замечание: всегда помни закрыть произведенный порт.

S_fileName- имя файла для чтения; это может быть как символ, так и цепочка символов

p_inport- открытый порт для чтения названного файла

nil- файла не существует либо он не может быть открыт для чтения

Пример:

Если файл существует и читаем:

in = infile("~/test/input.il") => port:"~/test/input.il"

Если файл не существует либо не читаем:

infile("myFile") => nil

close(in) => t

outfile(S_fileName [ t_mode ] [ g_openHiddenFile ] ) => p_outport | nil

Открывает готовый порт выхода для чтения файла.

Файл может быть указан какой-либо абсолютной директорией или относительной директорией. Если заданный путь относителен, и текущий путь SKILL установлен на nil, то все директории из директорий SKILL проверяются в порядке, вслед за этим файлом. Заметьте, что надежно закрепленный путь текущей директории для примера , ./, ../, или ../../.., и т.д., не считается относительным путем.

Если он обнаружен, то система переписывает первый обновленный файл в списке. Если найден необновленный файл, его размещают в новом файле по имени первой написанной директории.

Если дополнительный аргумент g_openHiddenFile указан, то будет создан или открыт существующий файл. (только для использования в Windows)

S_fileName-имя файла, который должен быть открыт или создан

t_mode- может быть w или a (w- перезаписать существующий файл, a- записать в конец существующего файла)

p_outport - порт выхода готов писать указанный файл

nil- файла не существует либо он не может быть открыт для записи

Пример:

p = outfile("/tmp/out.il" "w") => port:"/tmp/out.il"

outfile("/bin/ls") => nil

close(p_port ) => t

Закрывает, освобождает порт.

Не используйте эту функцию с piport, poport, stdin, stdout, и stderr.

p_port- название порта для закрытия

t- возвращает t, если порт закрыт успешно

Пример:

p = outfile("~/test/myFile") => port:"~/test/myFile"

close(p) => t

Вывод данных.

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"

newline( [ p_outputPort ] ) => nil

Печатает символ новой строки.

p_outputPort- порт выхода для печати. По умолчанию - poport

Всегда возвращает nil после того, как объект напечатан.

Пример:

print("Hello") newline() print("World!")

"Hello"

"World!"

=> nil

printlev( g_value x_level x_length [ p_outputPort ] ) => nil

Печатает список с ограниченным числом элементов и уровней вложений.

Списки печатаются целиком, не смотря на то, как много элементов они имеют или какова глубина вложений. Приложения имеют опции, однако, если устанавливается количество элементов сверх лимита или больше запланированных уровней вложений, то это показывается при печати списков. Данные ограничения часто необходимы для контроля объема интерактивной исходящей информации, т.к. SKILL верхний уровень автоматически печатает результат вычисления. Ограничения также защищают от циклических ошибок при обращении, т.к. их появление возможно из-за ошибок программирования.

Две переменные, типа integer ,x_length и x_level, контролируют максимальное количество элементов и уровней вложений, которые будут напечатаны.

Список элементов выше максимального указывается при печати длины аббревиатурой “...” Список, где глубина вложений выше максимально допустимого уровня помечается аббревиатурой &.

Функция printlev идентична функции print, за исключением того, что имеет два дополнительных аргумента, указывающих на максимальный уровень и длину при печати выражений.

g_valueлюбой объект Skill

x_level- определяет уровень вложения, которое вы хотите напечатать; список вложений более глубоких, чем максимальный уровень указывается аббревиатурой как “&”.

x_length - определяет длину (или максимальное количество элементов), какую вы хотите напечатать. Список элементов выше максимального указывается аббревиатурой как “...”.

p_outputPort- порт выхода для печати. По умолчанию - poport

Всегда возвращает nil после того, как объект напечатан.

Пример:

List = '(1 2 (3 (4 (5))) 6)

=> '(1 2 (3 (4 (5))) 6)

printlev(List 100 2)

(1 2 ...)

=> nil

printlev(List 3 100)

(1 2 (3 (4 &)) 6)

=> nil

Соседние файлы в папке Лбы skill