Seed7 2012-01-01
Версия реализации Seed7 языка программирования Seed7Версия языка Seed7, выпущенная 1 января 2012 года.
Отличия от предыдущей версии:
-
Тип
pollData
перенесен изsocket.s7i
вpoll.s7i
. Теперь этот тип поддерживает следующие функции:clear, addCheck, removeCheck, getCheck, poll, getFinding, hasNext, iterChecks, iterFindings, nextFile, for
. -
Тип
inetListener
перенесен изsocket.s7i
вlistener.s7i
. Теперь этот тип поддерживает следующие функции:openInetListener, close, signOff, listen, accept, waitForRequest
. -
Тип
socketAddress
перенесен изsocket.s7i
вsockbase.s7i
. Теперь этот тип поддерживает следующие функции:numericAddress, inetSocketAddress, inetListenerAddress, getHostname
. -
Добавлен файл
pol_dos.c
. -
Из интерпретатора и компилятора убрана поддержка действий
POL_ADD_READ_CHECK POL_ADD_WRITE_CHECK, POL_FILES, POL_HAS_NEXT_READ_FILE, POL_HAS_NEXT_WRITE_FILE, POL_NEXT_READ_FILE, POL_NEXT_WRITE_FILE, POL_READY_FOR_READ, POL_READY_FOR_WRITE, POL_REMOVE_READ_CHECK, POL_REMOVE_WRITE_CHECK, SOC_SELECT_INPUT
. -
В интерпретатор и компилятор добавлена поддержка действий
POL_ADD_CHECK, POL_GET_CHECK, POL_GET_FINDING, POL_HAS_NEXT, POL_ITER_CHECKS, POL_ITER_FINDINGS, POL_NEXT_FILE, POL_REMOVE_CHECK, SOC_GET_ADDR
. -
Добавлены или улучшены файлы
pollib.c, pollib.h, pol_dos.c, pol_sel.c, pol_unx.c, pol_drv.h, soclib.c, soclib.h, soc_rtl.c, soc_dos.c
. -
Улучшен пример
ftpserv.sd7
. -
Улучшен драйвер консоли
con_win.c
(keypressed
распознает Ctrl-C как нормальный ввод с клавиатуры). -
Улучшена функция
socGets
, чтобы избежать вызоваrealloc()
, если строка короче, чем запрашивается.
Ссылки:
Примеры:
Факториал - Seed7 (12):
Используется рекурсивное определение факториала. Для хранения значений факториала используется тип bigInteger
, поэтому переполнения не происходит.
$ include "seed7_05.s7i";
include "bigint.s7i";
const func bigInteger: factorial (in var bigInteger: n) is func
result
var bigInteger: result is 1_;
begin
if n = 0_ then
result := 1_;
else
result := n * factorial(n - 1_);
end if;
end func;
const proc: main is func
local
var integer: n is 0;
begin
for n range 0 to 16 do
write(n);
write("! = ");
write(factorial(bigInteger conv n));
writeln;
end for;
end func;
Факториал - Seed7 (13):
Используется встроенная функция !n, определенная только для типа данных integer
. 13! больше максимально возможного значения этого типа, и попытка его вычисления вызывает арифметическое переполнение. В результате вывод программы имеет следующий вид:
0! = 1
1! = 1
2! = 2
...
11! = 39916800
12! = 479001600
13! =
*** Uncaught EXCEPTION NUMERIC_ERROR raised with
{! integer <80ba990>: <SYMBOLOBJECT> 0 }
{! (in integer <80ba990> param) } at factorial-builtin.sd7(10)
main no POSINFO
$ include "seed7_05.s7i";
const proc: main is func
local
var integer: n is 0;
begin
for n range 0 to 16 do
writeln(n <& "! = " <& !n);
end for;
end func;
CamelCase - Seed7 (429):
В примере используется посимвольная обработка введенной строки.
$ include "seed7_05.s7i";
const proc: main is func
local
var string: text is "";
var string: camel_case is "";
var char: ch is ' ';
var boolean: was_space is TRUE;
begin
readln(text);
text := lower(text);
for ch range text do
if ch in {'a' .. 'z'} then
if was_space then
ch := upper(ch);
end if;
camel_case &:= ch;
was_space := FALSE;
else
was_space := TRUE;
end if;
end for;
writeln(camel_case);
end func;
Hello, World! - Seed7 (14):
$ include "seed7_05.s7i";
const proc: main is func
begin
writeln("Hello, World!");
end func;
Числа Фибоначчи - Seed7 (428):
Используется рекурсивное определение чисел Фибоначчи.
$ include "seed7_05.s7i";
const func integer: fibonacci (in var integer: n) is func
result
var integer: result is 1;
begin
if n < 2 then
result := 1;
else
result := fibonacci(n - 1) + fibonacci(n - 2);
end if;
end func;
const proc: main is func
local
var integer: n is 0;
begin
for n range 0 to 15 do
write(fibonacci(n) <& ", ");
end for;
writeln("...");
end func;
Квадратное уравнение - Seed7 (430):
$ include "seed7_05.s7i";
include "float.s7i";
include "math.s7i";
const proc: main is func
local
var float: a is 0.0;
var float: b is 0.0;
var float: c is 0.0;
var float: d is 0.0;
begin
readln(a);
if a = 0.0 then
writeln("Not a quadratic equation.");
else
readln(b);
readln(c);
d := b ** 2 - 4.0 * a * c;
if d = 0.0 then
writeln("x = " <& (-b / 2.0 / a));
else
if d > 0.0 then
writeln("x1 = " <& ((-b + sqrt(d)) / 2.0 / a));
writeln("x2 = " <& ((-b - sqrt(d)) / 2.0 / a));
else
writeln("x1 = (" <& (-b / 2.0 / a) <& "," <& (sqrt(-d) / 2.0 / a) <& ")");
writeln("x2 = (" <& (-b / 2.0 / a) <& "," <& (-sqrt(-d) / 2.0 / a) <& ")");
end if;
end if;
end if;
end func;
Комментарии
]]>blog comments powered by Disqus
]]>