Модератор: Модераторы
debi12345 писал(а):Кстати сейчас во всех языках мода (а может и устойчивый трэнд) на дженерики, некоторые новые уже завоевашие место под солнцем (Go, Rust) сразу идут без ООП но с дженериками - трэйтами. Даже в С++ появились трэйты (специализации дженериков под конкретые типы данных)
, само по себе было ненормальностью и частным солучаем
Или этот " этот дождь на долго" ?
а любая ненормальность или частный случай рано или поздно фиксится или уходит в архив.
То, что строки (а не байтовые массивы - фиксированные буферы, открытые и динамические) раньше "из коробки" (без перекодировки, без передачи информации о локали и т.д.) без искажения проходили через сетевые соедиения, само по себе было ненормальностью
Есть плюсы - иначе эту тему бы не продвигали. Дженерики без ООП заставляет программить без поднего связывания - а значит код быстрее, упрощается компилятор, резко усложняется обмен через глобальные переменные (что подталкивает к передовому функциональному программированию), на этапе компиляции можно выловить все потенциальные рантайм-проблемы (Rust на этом буквально помешан), также вся мощь функционала макросов...(Что дает ООП понятно сразу, а вот смысл дженериков( по русски "универсальников") ускользает что-то вроде "смеси обычного свойства класса с типом вариант" - что там такого, что нельзя сделать в обычном классе непонятно )
Я не рекомендую никому учить или использовать Паскаль (в отличие от, например, года 2014-го). Просто молчу об этом.
По идее, нормальная практика парсинга - сразу переводить в WideString
debi12345 писал(а):"Gо" сразу попал в амбициозную нишу "как С но намного проще", "Rust" - в амбициозную нишу "резко улучшенный движок крайне популярного семейства вэб-браузеров"
Cheb писал(а):Я не рекомендую никому учить или использовать Паскаль (в отличие от, например, года 2014-го). Просто молчу об этом.
даже в этом вроде бы универсальном типе может храниться множество кодировок, зависящих даже от порядка байтов в слове.
Utf16String = UnicodeString;
Ucs2Char = UnicodeChar;
PUcs2Char = PUnicodeChar;
Тогда уж лучше всегда однобайтная UTF-8,
debi12345 писал(а):всегда однобайтная UTF-8
procedure CP_Utf8StringToUtf16String (PField: pointer; Tind1, Tind2: integer); register;
var
v: Utf8String;
begin
ReadField(@v, Tind1);
WideString(PField^):= Utf8Decode(v);
end;
{$ifdef windows}
//On Windows platform, these types are *DIFFERENT*!
// The encoding is identic (utf16), but memory management is NOT!
procedure CP_Utf16StringToWideString (PField: pointer
; Tind1, Tind2: integer); register;
var
v: Utf16String;
begin
ReadField(@v, Tind1);
WideString(PField^):= v;
end;
procedure CP_WideStringToUtf16String (PField: pointer
; Tind1, Tind2: integer); register;
var
v: WideString;
begin
ReadField(@v, Tind1);
Utf16String(PField^):= v;
end;
{$endif}
А куда попали "F#" и "haskell" ?
Заранее подложил соломки, объявив
Стоп, это где это UTF-8 однобайтная и тем более "всегда "?
UCS2-BE, UCS2-LE, UTF16-BE, UTF16-LE
function FileNameToUtf16(f: TFileNameString): Utf16String;
function Utf16ToFileName(u: Utf16String): TFileNameString;
function FileNameToUtf8(f: TFileNameString): Utf8String;
function Utf8ToFileName(u: Utf8String): TFileNameString;
!внезапно! объявят UnicodeString = UCS4String.
Любимая пища для параноика Rust - он бы Вас по этим лабиринтам водил за руку и не дал бы сделать ни шага в сторонуИзначально всё расчитывалось на абсолютную невозможность двух операций сериализации/обхода графа одновременно. Но я таки вштырил запорожцу реактивный двигатель, научив выполнять вложенные обходы. При этом гонял табуны параметров, как курей веником. Из глобальных переменных - в поля класса, из класса в класс, потом снова в глобальные переменные для удобства, потом учил вложенные матрёшки обходчиков эти глобальные переменные правильно сохранять и восстанавливать...
Planned for 1.3:
1. Add support for layers lockable using VirtualProtect / its Linux equivalent to raise an AV on write.
2. Implement cloning helper and the Clone method
3. Support shortstrings (because ansistrings are too bloated in 3.x for simple tasks like storing identifiers)
4. Added an optional debugging tool thаt traverses the tree searching for dangling references before cleaning graveyards
5. Add heaptrace mode (keeping a full backtrace of allocating call for each block)
Changelog 1.1.21 -> 1.1.22
1. FINAL decision of Chepersy staying single-threaded forever.
2. Dropped backward compatibility (again)
3. Dropped interface support, reverted TChepersyObject back to a simple descendant of TObject
4. Created a specialized class instance memory manager supporting accelerated fields and evicted the cache-unfriendly traversing index and mask into accelerated fields.
5. Returned support for scraped flag, scraping and local graveyards. The graveyards are designed to be cleaned each frame: this is a game engine, not a spherical cow.
6. Switched all graph traversal, including serializing and deserializing, to descendants of a specialized abstract class.
7. Support for up to 4 nested graph traversing operations. Intended for resource cloning, on-the-fly game world packing and other such operations in the middle of saving the game and such.
8. Dropped cloning as a form of graph traversal. Will be re-implemented in a later version as a helper function of cloning a single object, designed for layered game world support.
9. Dropped support for types: fixed32, WideString.
10. 8-bit string serialization keeps encoding (if compiled in fpc 2.6.4, is ignored at reading and always treated as utf-8 at writing)
Любимая пища для параноика Rust
Cheb писал(а):[рукалицо]
Ну, естественно я запостил ссылку на свой локальный сервер, а не на боевой:
http://chentrah.chebmaster.com/?what=tech
Вернуться в Разработки на нашем сайте
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3