Язык программирования Caif
5 subscribers
5 photos
12 files
9 links
Быстрое создание 64-битных приложений.
Download Telegram
Как мне подсказали товарищи на канале Форт и общение фортеров,
mov rcx, rax работает быстрее чем
xchg rax, rcx
Этот ассемблерный вариант fibo работает примерно в 5 раз быстрее, чем приведенный выше.
CODE fibo ( u -- u1 )
mov rcx, rax
mov rax, 0
mov rbx, 1
@@:
mov rdx, rbx
add rbx, rax
mov rax, rdx
dec rcx
cmp rcx, 0
jnz @b
ret
END-CODE
Простой тренажер для запоминания иностранных слов
на основе частоты употребления слов.
\ main.fs

use args
use stou
use input

\ количество словарных статей
== N 1521

\ количество слов в блоке
== Q 10

value block 0
value record 0

struct
-- :word \ слово
-- :text \ перевод
ends mot

carray mots mot*N

== qlen 62
carray instr qlen+2

: setlen 62 instr c! ;
: prompt ." : " ;
: say count type ;
: merase mots len-struct mot N * erase ;
: num2adds ( u -- a ) len-struct mot * mots + ;
: press setlen instr input drop ;
value index 0

f: add_record word text -- 0
locals| a |
b{
index num2adds -> a
index 1+ to index
word a :word !
text a :text !
}

: append add_record drop ; as <<

include" ini.fs"

: doWord ( num -- )
space num2adds
dup :word @ say
." " press space
:text @ say
cr cr ;

f: loop1 num
b{
Q 0 DO
num doWord
num 1+ -> num
LOOP
-1
}

: loop2 begin record loop1 drop again ;

: main cr
args
argc @ 1 >
IF 1 argv atou
dup 152 > if drop 151 then
Q * to record
THEN

put "Ctrl+C - Выход"
cr
put "Enter - Листать. "
cr cr
merase
ini
loop2
;

Сам словарь здесь не привожу ввиду объёма.
Он в файле ini.fs, имеющий простой формат:
" слово" " перевод" <<
Для примера:
: ini
" et" " и" <<
" être _ été" " быть" <<
" à" " в" <<
" il" " он" <<
" ses" " его, её" <<
...
;
\eof

Скомпилированное приложение fcram.zip
см. последний пост на моем канале:
https://t.me/des_mots_canal
ecram.zip
418.2 KB
Англо-русский частотный словарь.
7800 словарных статей.
Мною для вас скомпилирован.
Исходник и словарь в каталоге SOURCE .
Запуск:
ecram <номер блока>
ecram - по умолчанию нулевой блок

В словаре 780 блоков, по 10 словарных статей
в каждом блоке
Версия сегодняшнего дня.
В следующей версии caif :

файл \LIB\map.fs
#orig _vy_map

f: map1 term x start end
{
BEGIN start end < WHILE
x start term execute
start 1+ -> start
REPEAT
}

\eof


файл \EXAMPLES\map\map1\main.fs
use map
use fastpow

== xnum 2

: curried_pow ( y x -- ) fastpow . cr ;

: main cr ' curried_pow xnum 0 17 map1 drop cr ;

\\
Вычисление степеней двойки.
Более изощренная версия map2 в разработке.
map2 применяет к переданным аргументам первую функцию f1 .
Затем к полученному результату применяет вторую функцию f2 .

файл \EXAMPLES\map\map1\main.fs

use map

: f1 ( x -- ) ( F: -- r ) s>f ;

: f2 ( F: r -- ) fsqrt f. cr ;

: main cr ' f1 0 1 17 ' f2 map2 drop cr ;

\\
Вычисление квадратных корней.
Определение map2 также файле \LIB\map.fs
f: map2  term1 x start end term2
{
BEGIN start end < WHILE
x start term1 execute
term2 execute
start 1+ -> start
REPEAT
}
Во многих случаях возможно использование map1 , map2 , как альтернатива циклу DO LOOP.
use map

: acircle ( x -- ) dup u. 7 spaces s>f
f**2 fpi f* f. cr ;

: main cr ." Radius Area" cr
cr ' acircle 0 1 11 map1 drop cr ;

\\
Площади круга
Не стоит использовать map в критичном по времени коде, так как DO LOOP
работает примерно в 6 - 7 раз быстрее.
Сегодня выложил версию caif 0.25.3.1
https://gitflic.ru/project/ykovlev-vadim_1/caiflang/file?file=&branch=caif

Добавил итераторы,
изменения семантbки выполнения данных.

Дюжина примеров.