Как же не хватает типов данных ФЯ во всяких этих C++ или C#.
Вот например нужен мне временный тип в одном месте -- только в одном, который может содержать ИЛИ строку, ИЛИ массив строк, ИЛИ быть нулём -- что-то одно -- чтобы этот тип параметризировать как V в Dictionary<K, V>. В С#'ах и прочих шедеврах быдломысли, где траблы с алгебраическими типами данных, мне придётся описывать несколько классов:
Цитироватьenum DicValueType
{
Null,
String,
StringArray
}
struct DicValue
{
public DicValueType Type;
public String AsString;
public String[] AsStringArray;
}
Можно ещё через наследование сделать*, но будет больший костыль.
В обычном си этот костыль обычно делается через юнионы, но это только экономит память, но не количество буков (нельзя делать анонимные юнионы, к примеру):
Цитироватьtypedef struct
{
enum ValueType type;
union
{
char** as_str;
char* as_str_arr;
} p;
} DicValue;
Вот реально, по сравнению с языками с нормальной типизацией, эта писанина кажется прыжком обратно в 80-ые. Кобол какой-то раздутый с goto'ами. Потому что в функциональщине это обычно описывается примерно так:
data DicValue = Null | AsString String | AsStringArray [String]Лол.
В ходе попытки написания синтаксического парсера человеческих языков на C# (номальная работа со строками была нужна), мне столько раз приходилось так костылить, эх... Могёт, на Окамле попробовать? На Хаскеле боязно.
* Хотя нет, наследование нельзя. Для экономии памяти я в C# использую для таких случаев structs, которые живут только в стеке, без выделения на куче, но они не наследуются.
Цитата: Неодобренный в силу технических проблем ЧукчоПричёмтуткобол?
Hello, World в сравнении:
Цитата: C#include <stdio.h>
int main(void) {
printf("Hello World");
return 0;
}
Цитата: COBOL
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. HELLOWORLD.
000300
000400*
000500 ENVIRONMENT DIVISION.
000600 CONFIGURATION SECTION.
000700 SOURCE-COMPUTER. RM-COBOL.
000800 OBJECT-COMPUTER. RM-COBOL.
000900
001000 DATA DIVISION.
001100 FILE SECTION.
001200
100000 PROCEDURE DIVISION.
100100
100200 MAIN-LOGIC SECTION.
100300 BEGIN.
100400 DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
100500 DISPLAY "Hello world!" LINE 15 POSITION 10.
100600 STOP RUN.
100700 MAIN-LOGIC-EXIT.
100800 EXIT.
Кобол: Наводите ПИСТОЛЕТ COLT 45 на НОГА.СТОПА, ТОГДА помещаете РУКА.КИСТЬ.ПАЛЕЦ на ПИСТОЛЕТ.КРЮЧОК и ПОЖАЛУЙСТА, НАЖИМАЕТЕ. ТОГДА возвращаете ПИСТОЛЕТ в КОБУРУ. ПОЖАЛУЙСТА, ПРОВЕРЬТЕ, нуждаются ли шнурки в повторном связывании.
А ведь на этом чуде написано ядро Oracle`а...
Скачал 20 мегов, думал F# установить (OCaml под .NET, уи-и-и), а он оказывается в отношении среды несовместим с Visual C# Studio 2008 Express, надо или полноценную версию студии брать, или 380 мб дополнительных качать для Visual Studio 2008 Shell. Как-то не хочется :'(