Re: Case-sensitive Refal+


Sergei M Abramov at home (abram@botik.ru)
Fri, 3 Dec 1999 20:03:39 +0300


День добрый, всем!

>Извините за занудство (;-) и повтор, но я по-прежнему придерживаюсь мнения,
>что никаких чисто рефальских библиотек (кроме уж совсем "ядреных", имеющих
>дело с понятиями самого Рефала, вроде арифметики)

(Я всегда был) Абсолютно согласен с идеей:
    (1) рефальская библиотека должна содержать только рефальские примитивы,
    (2) плюс интерфейс со всем нерефальским миром.
    (3) При этом (и я с А(К) согласен!) прикладные библиотеки (файлы,
        каталоги, окна, менюшки, мышки, курсоры, хренюшки и т.п.)...
>... разрабатывать не следует,
>а нужно (просто-таки необходимо, чтобы Рефал не умер, а пошел в жизнь)
>пристыковать его в существующим распространенным библиотекам:
    [...опущено много правильного, с которым я согласен...]
>Что нужно продумать -- это общий механизм вызова таких библиотек из Рефала.
    [...опущено много правильного, с которым я согласен...]
>Я убежден, что если это не будет сделано, то даже великий факт наличия
>суперкомпилятора для Рефала его не спасет. Мы сами вбиваем гвоздь...

Я почти со всем согласен, кроме разве что...в данной короткой записке я вот про
что: Андрей (К) это явно не утверждал, но мне показалось (возможно я ошибаюсь),
что "промелькнула" мысль:

    <<(1) -- это мало (в смысле объема поддержки, числа функций, объема
программирования и т.п.)--ну там арифметика всякая...и тому подобное...
      (2) -- это не много и это жизненнонеобходимо (см. выше);
      (3) -- а это мы вообще получим задарма (имея 2).
>>

    (* Забегая вперед: в данной записке я говорю: не верно, что (1) --"это
мало". Часть (1) сегодня в рефале+ это 3/4 (75%) объема всей библиотеки! И
только 1/4 обеспечивается тем, что в светлом будущем покроет (2)+(3).
        Вот почему МОЖНО ГОВОРИТЬ о СИЛЬНОЙ (не слабой) привязанности библиотеки
к run-time support системе
    *)

Мне было интересно посмотреть, а сколько на САМОМ ДЕЛЕ, НА ПРАКТИКЕ этих самых
чисто-рефальских функций? Кроме того, мне было интересно сделать ревизию

    (* сделать ревизию == подвергнуть сомнению, опираясь в том числе и на идею
Андрея о разбиении 1+2+3, с которой я в целом согласен *)

Рефал+ библиотеки.

Короткие результаты

    (* замечу, что в группах "+", "-" и "?" 102 рефал-функции, поэтому я не стал
вычислять удельный--в процентах,--вес групп *)

все сегодняшние функции Рефал+ библиотеки разбиты на 4 группы (разбиение не
объективно---отражает мнение Абрамова):

"+" -74- это часть (1) в классификации Андрея
         Работа с рефал-"объектами", звеньями, рюкзаками и
         их тэгами...
         Это придется переписывать при смене run-time support системы.
         Вам кажется много?
         Попробуйте от чего-нибудь отказаться -- список ниже ;-)

"-" -16- это должно покрыться частью (2+3)
         Связь с ОС. Сегодня это: время, аргументы командной строки, переменные
         окружение, работа с файлами. Видимо должно покрыть идеей Андрея:
         (2)+(3) -- включая всякие ОЛЕ и КОРБЫ.

"?" -12- среднее между (1) и (2) -- во как интересно! Я не могу определиться...
         . Не рефальские преобразования (в том числе зависимые
           от regional setings) Пример:
               $func TO-UPPER e.Char = e.Char;
         . Ввод/вывод РЕФАЛЬСКИХ констант.
????? Куда их отнести?
           Пример:
             $func? READ = t.Term;

"." -61- явные рудименты -- просто должны отмереть:
         . 20 штук -- Ввод/вывод CONIO (кто-нибудь помнит, что такое
           KEY-PRESSED? и GET-SCR-CHAR-ATTR ?)
         . 23 штуки RF5LIB (отмирает, если мы говорим об __общей__ библиотеке)
         . 18 штук WINDOW (кто-нибудь помнит, что такое окна в текстовом режиме
           монитора?)

Вот такая статистика...
А подробная табличка ниже

Удачи

Сергей
/////////////////////////////////////////////////////////////////
"-" 16 штук;
Связь с ОС (время, аргументы, окружение, файлы)

- $func ARG s.Int = e.Arg; DOS
- $func CHANNEL = s.Channel; STDIO
- $func CLOSE-CHANNEL s.Channel = ; STDIO
- $func GETENV e.VarName = e.Value; DOS
- $func PRINT e.Expr = ; STDIO
- $func PRINT! s.Channel e.Expr = ; STDIO
- $func PRINTLN e.Expr = ; STDIO
- $func PRINTLN! s.Channel e.Expr = ; STDIO
- $func TIME = e.String; DOS
- $func? CHANNEL? e.Exp = ; CLASS
- $func? EOF? s.Channel = ; STDIO
- $func? OPEN-FILE s.Channel e.FileName s.Mode = ; STDIO
- $func? READ-CHAR = s.Char; STDIO
- $func? READ-CHAR! s.Channel = s.Char; STDIO
- $func? READ-LINE = e.Char; STDIO
- $func? READ-LINE! s.Channel = e.Char; STDIO

"?" 12 штук;

(6) Не рефальские преобразования (в том числе зависимые от regional
setings)

? $func BYTES-TO-CHARS e.Char = e.Int; CONVERT
? $func CHARS-TO-BYTES e.Int = e.Char; CONVERT
? $func TO-LOWER e.Char = e.Char; CONVERT
? $func TO-UPPER e.Char = e.Char; CONVERT
? $func? DIGIT? e.Exp = ; CLASS
? $func? LETTER? e.Exp = ; CLASS

(6) Ввод/вывод РЕФАЛЬСКИХ констант

? $func? READ = t.Term; STDIO
? $func? READ! s.Channel = t.Term; STDIO
? $func WRITE e.Expr = ; STDIO
? $func WRITE! s.Channel e.Expr = ; STDIO
? $func WRITELN e.Expr = ; STDIO
? $func WRITELN! s.Channel e.Expr = ; STDIO

"+" -- 74 штуки
Работа с рефал-"объектами", звеньями, рюкзаками и их тэгами...

+ $func ? s.Box = e.Exp; BOX
+ $func "-" s.Int1 s.Int2 = s.Int; ARITHM
+ $func "*" s.Int1 s.Int2 = s.Int; ARITHM
+ $func "+" s.Int1 s.Int2 = s.Int; ARITHM
+ $func BIND s.Tab (e.Key) (e.Val) = ; TABLE
+ $func BOX e.Exp = s.Box; BOX
+ $func COMPARE (e.Exp1)(e.Exp2) = s.Res; COMPARE
+ $func DIV s.Int1 s.Int2 = s.Quo; ARITHM
+ $func DIV-REM s.Int1 s.Int2 = s.Quo s.Rem; ARITHM
+ $func EXIT s.ReturnCode = ; DOS
+ $func GCD s.Int1 s.Int2 = s.Gcd; ARITHM
+ $func LENGTH e.Exp = s.ExpLen; ACCESS
+ $func REM s.Int1 s.Int2 = s.Rem; ARITHM
+ $func REPLACE-TABLE s.TargetTab s.SourceTab = ; TABLE
+ $func STORE s.Box e.Exp = ; BOX
+ $func STRING e.Source = s.String; STRING
+ $func STRING-FILL s.String s.Fill = ; STRING
+ $func STRING-INIT s.String s.Len s.Fill = ; STRING
+ $func STRING-LENGTH s.String = s.Len; STRING
+ $func STRING-REF s.String s.Index = s.Char; STRING
+ $func STRING-REPLACE s.String e.Source = ; STRING
+ $func STRING-SET s.String s.Index s.Char = ; STRING
+ $func SUBSTRING s.String s.Index s.Len = s.NewString; STRING
+ $func SUBSTRING-FILL s.String s.Index s.Len s.Fill =; STRING
+ $func SUBVECTOR s.Vector s.Ind s.Len = s.Vector; VECTOR
+ $func SUBVECTOR-FILL s.Vector s.Index s.Len e.Fill =; VECTOR
+ $func TABLE = s.Tab; TABLE
+ $func TABLE-COPY s.Tab = s.TabCopy ; TABLE
+ $func TO-CHARS e.Exp = e.Char; CONVERT
+ $func TO-WORD e.Char = s.Word; CONVERT
+ $func UNBIND s.Tab e.Key = ; TABLE
+ $func VECTOR e.Source = s.Vector; VECTOR
+ $func VECTOR-FILL s.Vector e.Fill = ; VECTOR
+ $func VECTOR-INIT s.Vector s.Len e.Fill = ; VECTOR
+ $func VECTOR-LENGTH s.Vector = s.Len; VECTOR
+ $func VECTOR-REF s.Vector s.Index = e.Exp; VECTOR
+ $func VECTOR-REPLACE s.Vector e.Source = ; VECTOR
+ $func VECTOR-SET s.Vector s.Index e.Exp = ; VECTOR
+ $func VECTOR-TO-EXP s.Vector = e.Exp; VECTOR
+ $func? "/=" (e.Exp1)(e.Exp2) = ; COMPARE
+ $func? "<" (e.Exp1)(e.Exp2) = ; COMPARE
+ $func? "<=" (e.Exp1)(e.Exp2) = ; COMPARE
+ $func? "=" (e.Exp1)(e.Exp2) = ; COMPARE
+ $func? ">" (e.Exp1)(e.Exp2) = ; COMPARE
+ $func? ">=" (e.Exp1)(e.Exp2) = ; COMPARE
+ $func? APPLY s.Name e.Exp = e.Exp; APPLY
+ $func? BOX? e.Exp = ; CLASS
+ $func? CHAR? e.Exp = ; CLASS
+ $func? DOMAIN s.Tab = e.KeyList ; TABLE
+ $func? FUNC? e.Exp = ; CLASS
+ $func? IN-TABLE? s.Tab e.Key = ; TABLE
+ $func? INT? e.Exp = ; CLASS
+ $func? L s.Left e.Exp = t.SubTerm; ACCESS
+ $func? LEFT s.Left s.Len e.Exp = e.SubExp; ACCESS
+ $func? LOOKUP s.Tab e.Key = e.Val; TABLE
+ $func? MIDDLE s.Left s.Right e.Exp = e.SubExp; ACCESS
+ $func? R s.Right e.Exp = t.SubTerm; ACCESS
+ $func? RIGHT s.Right s.Len e.Exp = e.SubExp; ACCESS
+ $func? STRING? e.Exp = ; CLASS
+ $func? TABLE? e.Exp = ; CLASS
+ $func? TO-INT e.Char = s.Int; CONVERT
+ $func? VECTOR? e.Exp = ; CLASS
+ $func? WORD? e.Exp = ; CLASS
+ $func BIT-OR s.Int1 s.Int2 = s.Int; BIT
+ $func BIT-AND s.Int1 s.Int2 = s.Int; BIT
+ $func BIT-XOR s.Int1 s.Int2 = s.Int; BIT
+ $func BIT-NOT s.Int = s.Int; BIT
+ $func BIT-LEFT s.Int s.Shift = s.Int; BIT
+ $func BIT-RIGHT s.Int s.Shift = s.Int; BIT
+ $func? BIT-TEST s.Int s.Pos = ; BIT
+ $func BIT-SET s.Int s.Pos = s.Int; BIT
+ $func BIT-CLEAR s.Int s.Pos = s.Int; BIT
+ $func BIT-PRINT s.Int = ; BIT
+ $func BIT-LENGTH s.Int = s.Len; BIT

20 штук -- Ввод/вывод CONIO
. $func? KEY-PRESSED? = ; CONIO
. $func READ-KEY = s.Char; CONIO
. $func GET-SCR-CHAR-ATTR s.Row s.Col = s.Ch s.Attr; CONIO
. $func PUT-SCR-CHAR s.Row s.Col s.Ch = ; CONIO
. $func PUT-SCR-ATTR s.Row s.Col s.Attr = ; CONIO
. $func GET-FIELD-STR s.Row s.Col s.Length = s.Chars; CONIO
. $func PUT-FIELD-STR s.Row s.Col s.Length s.Chars = ; CONIO
. $func PUT-FIELD-ATTR s.Row s.Col s.Length s.Attr = ; CONIO
. $func GET-CURSOR = s.Row s.Col; CONIO
. $func SET-CURSOR s.Row s.Col = ; CONIO
. $func GET-CURSOR-FORM = s.StartLine s.EndLine; CONIO
. $func SET-CURSOR-FORM s.StartLine s.EndLine = ; CONIO
. $func GET-ATTRIBUTE = s.Attr; CONIO
. $func SET-ATTRIBUTE s.Attr = ; CONIO
. $func GET-TEXT-MODE = s.Rows s.Cols; CONIO
. $func CLEAR-SCREEN = ; CONIO
. $func CWRITE e.Expr = ; CONIO
. $func CWRITELN e.Expr = ; CONIO
. $func CPRINT e.Expr = ; CONIO
. $func CPRINTLN e.Expr = ; CONIO

23 штуки RF5LIB
. $func "rf5CARD" e.Prompt = e.Line; RF5LIB
. $func "rf5CLOSE" s.Fnum = ; RF5LIB
. $func "rf5GET" s.Fnum = e.Line; RF5LIB
. $func "rf5OPEN" s.Mode s.Fnum e.Fname = ; RF5LIB
. $func "rf5PRINT" e.Line = e.Line; RF5LIB
. $func "rf5PUT" s.Fnum e.Line = e.Line; RF5LIB
. $func "rf5PUTOUT" s.Fnum e.Line = ; RF5LIB
. $func "rf5ADD" (s)s = s; RF5LIB
. $func "rf5DIV" (s)s = s; RF5LIB
. $func "rf5DIVMOD" (s)s = (s.Quot)s.Rem ; RF5LIB
. $func "rf5MOD" (s)s = s; RF5LIB
. $func "rf5MUL" (s)s = s; RF5LIB
. $func "rf5SUB" (s)s = s; RF5LIB
. $func "rf5BR" e =; RF5LIB
. $func "rf5CP" e.Key = e.Val; RF5LIB
. $func "rf5DG" e.Key = e.Val; RF5LIB
. $func "rf5DGALL" = e.Stack; RF5LIB
. $func "rf5RP" e =; RF5LIB
. $func "rf5FIRST" s.N e.Exp = (e.Prefix) e.Postfix; RF5LIB
. $func "rf5LAST" s.N e.Exp = (e.Prefix) e.Postfix; RF5LIB
. $func "rf5LENW" e.Exp = s.Len e.Exp; RF5LIB
. $func "rf5TYPE" e.Exp = s.Type e.Exp; RF5LIB
. $func "rf5NUMB" e = s; RF5LIB

18 штук WINDOW
. $const NO-FRAME = -1; WINDOW
. $func MAKE-WINDOW WINDOW
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width = ;
. $func MAKE-WINDOW! WINDOW
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width
         s.ClearWindow s.FrameStrPos s.FrameTypeStr = ;
. $func CURRENT-WINDOW-NO = s.WindowNo; WINDOW
. $func CURRENT-WINDOW = WINDOW
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width;
. $func CURRENT-WINDOW! = WINDOW
         s.WindowNo s.WindowAtt s.FrameAtt s.FrameStr
         s.Row s.Col s.Height s.Width
          s.ClearWindow s.FrameStrPos s.BorderChars ;
. $func? EXIST-WINDOW? s.WindowNo = ; WINDOW
. $func SHIFT-WINDOW s.WindowNo = ; WINDOW
. $func REMOVE-WINDOW = ; WINDOW
. $func REMOVE-WINDOW! s.WindowNo s.Refresh = ; WINDOW
. $func RESIZE-WINDOW! s.Row s.Col s.Height s.Width = ; WINDOW
. $func SET-WINDOW-ATTR s.Attr = ; WINDOW
. $func SET-FRAME-ATTR s.Attr = ; WINDOW
. $func SET-WINDOW-FRAME s.FrameAtt s.FrameStr WINDOW
                        s.FrameStrPos
                        s.BorderChars = ;
. $func SCROLL s.NoOfRows s.NoOfCols = ; WINDOW
. $func GET-WINDOW-STR = s.ScreenString; WINDOW
. $func PUT-WINDOW-STR s.ScreenString = ; WINDOW
. $func WINDOW-FILL s.Ch = ; WINDOW



This archive was generated by hypermail 2.0b3 on Fri Dec 03 1999 - 20:04:59 MSK