LINUX.ORG.RU

Избранные сообщения shnnmnn

Как научиться программировать?

Форум — Talks

Как научиться прогать? Как учились вы? Как учились раньше олды я уже нашел тему и прочитал.

Господа, у меня такая проблема, что в общем и целом подступиться пытаюсь к теме уже 2 года. Начинал я еще в 2009, купили книгу по питону и я ее не осилил. Вот так. Там начались логарифмы(или я их где-то усмотрел, потому что сейчас перечитываю и не могу найти их), а с матаном тогда было совсем туго. Ну я и подумал, что матан == программировать = не мое. На следующий год склепал для игры на ucoz сайтец, немного размял html, потом был следующий сайт уже на гугл конструкторе. В итоге тоже похоронил это дело, т.к. пошел учиться на истфак и информации было очень много. Где-то в 2018 году решил вернуться к вопросу.

Начал с objective-C, начал с основ, буквально неделю подолбился и понял, что дела иметь с аппл и прочим я не хочу, тогда еще свифт начал набирать популярность так что я и вовсе забил. Далее был php. В пхп вникнуть не смог - не знаю кто там говорит за легкость, но мне мешанина из html кода и пхп буквально взрывает мозг. На пхп максимум правил какие-то штуки в шаблонах всяких CMS и забил на это дело. Потом начал javascript, потом забил. Начал изучать Java - было интересно поднять свой сервер для ММОРПГ. Но в итоге как-то забил. Да, здесь вы можете сказать что моя проблема в том, что я забиваю, но читайте пожалуйста дальше эту простыню :)

Решил закрыть гештальт и вернуться к питону. Написал на питоне бота, который нужен был другу….ну как написал.. В этом то и вся проблема! Что написать я ничего не написал. Я просто перерывал кучи исходников, статей, из говна и палок собирая бота, плюясь и кряхтя, проклиная все на свете. Потом начал учить синтаксис питона, забил.

Когда забивал - в основном работал, естественно, не по специальности. Пердолил бубунту, потому что в моем манямирке прогать не на линухе не тру. Да и вообще неудобно. Опять же, вернулся к основам. Читал Лутца, читал A Byte of Python 2 раза, читал Грокаем Алгоритмы Бхаргава. Потом высрал еще пару ботов на питоне, почти схожим с предыдущим примером образом. Я не умею взять и сесть начать писать программу, я буквально не знаю с чего мне начать.

Изучал питоновские фреймворки, пытался делать вот вообще буквально все, куда питон можно приткнуть. Потом принялся изучать Lua, потому что мой друг на С пишет движок для игры и ему нужно было в помощь какой-то чел, умеющий в луну. На ней я скопипастил игрульку, кое-что в ней изменял, кое-что сам додумывал, но вцелом это все не в те ворота.

Недавно начал С++. Смотрю лекции по алгоритмам и структурам данных, читаю Страуструпа. Страуструп конечно молодец, под видом простого упражнения заставляет писать алгоритм бинарного поиска - я такого никогда не осилю. Вернее я могу заучить этот алгоритм и написать по памяти, могу всматриваться в код и понимать, что этот алгоритм бинарного поиска делает построчно и пошагово. Вникал так же в С, возвращался снова к Java. Попутно реализуя всякие проекты на питон.

Но проблема в том, что я абсолютный 0. Нет, не так. Дырка от 0. Вот установил wm awesome ради Lua. И то снес, хоть и жалко, не успел я напердолиться. Непонятно как именно строить программу на моем этапе.

Я могу взять чей то код, могу даже починить его и заставить работать - НО НА ЭТОМ ВСЕ.

Сначала, когда писал первого бота на питоне я проклинал все, эти ошибки, трейсбеки, все это уже давно поборол, отношусь нормально и к ошибкам времени компиляции на С.

Но как научиться строить программы? Мне кажется это абсолютно не мое. Сколько реального времени нужно долбить головой эту стену непонимания, чтобы наконец-то что-то из меня вышло?

У меня цель простая, хочу писать ПО для микроконтроллеров и вебом как-то на хлеб зарабатывать. А еще надо семью каким-то образом кормить. Просто жесть, неужели я должен столько пролитой крови на этом программировании спустить в унитаз и заняться чем-то другим? Ведь мозг можно обучить буквально всему. Но у меня не идет. Сейчас сижу просто над очередным проектом буквально сутки и не сдвинулся ни на шаг. Когда уже оно пойдет, кто знает? Что делать, как практиковаться?

 , , , ,

NorthernBlow
()

Расскажите про крипту на сегодняшний день

Форум — Talks

Т.к. намечаются явные траблы с валютой, похоже что надо будет осваивать крипту. Тема очень обширная, объять разумом трудно. Сориентируйте по «прикладной» части для нубов, которым надо в основном:

  • расплачиваться
  • возможно, хранить денежку
  • выводить за бугром

То есть, речь о «стабильной» крипте.

  • Какой кошелек/биржу посоветуете для «ежедневного использования». С учетом потенциальных банов. И какие варианты бакапов если угнали телефон и т.п.
  • Какая крипта лучше для ежедневного использования и длительного хранения.
  • Что в европах по законодательству насчет приземления крипты? Купить-то не проблема, но не хотелось бы на выводе претензий про легальность.

 

Vit
()

Ада капут, хайль Раст

Форум — Talks

Недавно прочитал, что Adacore будет через стартап Ferrous Systems предоставлять разрабам соотв. ответственных встраиваемых систем поддержку языка Раст. В дальнейшем планируется интероперабельность двух данных ЯП.

Я считаю это «звоночком», признаком того, что Раст признают в серьезной индустрии, а не только в вебе.

 ,

seiken
()

Опубликован исходный код игры «Самогонки»

Новости — Игры
Группа Игры

Исходный код игры «Самогонки» опубликован под лицензией GPLv3.

«Самогонки» — это уникальная аркадная гонка по маленьким сферическим планетам-трассам как в реальном времени, так и в пошаговом режиме. Игра разработана российской компанией KD-Lab. Студия KD Vision разрешила разместить данные в открытом доступе.

Исходный код выложен не полностью, поскольку он не полностью сохранился у разработчиков. Однако силами сообщества большая часть недоработок уже исправлена.

Ранее в открытый доступ был выложен исходный код других игр KD-Lab: ВанГеры и Периметр.

>>> Подробности

 ,

DileSoft
()

Домашнее рабочее место + ретроразработка

Галерея — Рабочие места

На машинке Debian 10 с запущенным свежескомпиленным эмулем hatari 2.3.1.

Хобби — ретроразработка. Поэтому, в эмуле запущен легендарный ассемблер DevPac-3 от HiSoft. Сижу, ковыряю STEшный блиттер :)

Кроме Atari, у меня успешно эмулируются амиги, спектрумы, MSXы и даже БК-шка.

( читать дальше... )

>>> Просмотр (4896x3672, 4820 Kb)

 , ,

max_power
()

Мужик за всего за год с нуля написал unix-like OS с GUI

Форум — Talks

Hello friends!

The Serenity operating system turns 1 year old today. I'm counting from the first commit in the git repository, on October 10, 2018

Фичи:

Pre-emptive multitasking

Multithreading

Compositing window server

IPv4 networking with ARP, TCP, UDP and ICMP

ext2 filesystem

Unix-like libc and userland

POSIX signals

Shell with pipes and I/O redirection

mmap()

/proc filesystem

И еще дофига всего остального

https://github.com/SerenityOS/serenity/

 

Uncle_Bobby
()

tor и youtube

Форум — Desktop

Скажите, что за ххх творится с сабжем? То не пускает вообще, то говнокапча бесконечно заставляет выделять сранные автобусы, зебры, велики, светофоры. Бесконечно.

А ранее пакет обновления (manjaro, пакетные манагеры pacman, yay) тора был url недоступен.

Вдобавок на ютубе что-то говорят про блокировки тора…

 ,

hikikomori
()

Как избежать сквозной линковки shared библиотек в cmake?

Форум — Development

Доброго времени суток. Подскажите, есть ли возможность сделать цепочную линковку библиотек и исполняемого файла в cmake? На данный момент я пытаюсь написать враппер над библиотекой и уже непосредственно работать с исполняемым файлом через вреппер. В случае если я удалю libmain.so что бы исполняемый файл через ldd указывал что имеет взамисвязь только с libwrapper.so и собственно запускался, но не выполнял никакого полезного действия.


Цепочка выглядит так: output–>libwrapper.so–>libmain.so С данным кодом у меня output смотри напрямую на libmain.so

cmake_minimum_required(VERSION 3.6)
project(example)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_library(main SHARED main.cpp)
add_library(wrapper SHARED wrapper.cpp)

target_link_libraries(wrapper PUBLIC main)

add_executable(output output.cpp)
target_link_libraries(output PRIVATE wrapper ${CMAKE_THREAD_LIBS_INIT} )

Как выглядит ldd output:

linux-vdso.so.1 (0x00007fff60bd4000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd9fb241000)
	libmain.so => /home/sysos/Desktop/test/example/build/main.so (0x00007fd9fa852000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd9fa670000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd9fa655000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd9fa463000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd9fb2a7000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd9fa314000)

Как выглядит ldd libwrapper.so:

linux-vdso.so.1 (0x00007ffef76a5000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f577fa85000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f577fc94000)

Заранее спасибо.

 , ,

AndrewNew
()

Подскажите в каких европейских странах не сложно получить гражданство линуксоиду?

Форум — Talks

Хотелось бы без всяких исследований родословных и подобного ...

PS: тропики не предлагать - очччень тяжело переношу жаркий климат.

 ,

cvv
()

Квартира - старая, место - новое

Галерея — Рабочие места

Потихоньку обживаюсь.

>>> Просмотр (2592x1728, 2085 Kb)

 

iLoveoOz
()

Умер сэр Клайв Синклер

Новости — Linux General
Группа Linux General

16 сентября 2021 года ушёл из жизни небезызвестный изобретатель и бизнесмен Клайв Синклер.

Большинство теперешних российских линуксоидов начинало знакомство с миром компьютеров с ПК ZX Spectrum производства Sinclair Research Ltd, который был чрезвычайно популярен в нашей стране в 90-е годы прошлого тысячелетия. И только заядлый линуксоид Линус Торвальдс, не будучи гражданином нашей страны, был вынужден учиться программировать не на ZX Spectrum, а на Sinclair QL — другом компьютере от компании Синклера, сделанном на процессоре Motorola 68008.

Со временем Линус разочаровался в Sinclair QL и приобрёл IBM PC 386, который использовал для написания ядра Linux. Однако в дальнейшем линукс был портирован на процессоры серии M68K, а в конце 90х энтузиастами был представлен и модернизированный вариант Sinclair QL (материнские платы под кодовым названием Q40 и Q60), способный запускать Linux.

Хотя непосредственного участия в развитии экосистемы линукс cэр Клайв не принимал, для всех нас он является отцом-основателем наших первых домашних компьютеров.

RIP.

>>> Подробности

 ,

anonmyous
()

Как вы относитесь к архитектуре ARM?

Форум — Talks

Посмотрел спеки - неплохая архитектура, очень похожа на мой любимый PDP-11. В отличие от x86, любой простой человек сможет программировать на ассемблере. Почему относят к RISC - не понял, оно гораздо ближе к PDP-11, которое никто никогда к RISC не относил.

К сожалению, на архитектуру уже навесили кучу разных расширений, не хуже чем на x86, в результате чего привлекательность архитектуры снижается.

Nxx
()

std::reduce (и собратия) с ограничением на число тредов

Форум — Development

Привет ЛОР.

Как ограничить максимальное число тредов, доступных для std::reduce с parallel_unsequenced_policy? Я просмотрел соответствующие страницы в cppreference, но не нашёл ответа. Я попробовал поиграться на уровене prlimit, но получил ошибку thread_monitor Resource temporarily unavailable in pthread_create. Хотелось бы не городить костылей в виде семафоров и мьютексов только ради такой казалось бы простой задачи.

UPD: В стандартной библиотеке так сделать нельзя, а вот в HPX можно. Вот пример: https://github.com/STEllAR-GROUP/hpx/blob/master/examples/quickstart/vector_zip_dotproduct.cpp

 , ,

luke
()

Что почитать по concurrency и memory model в С++11

Форум — Development

Интересуют atomics, CAS, memory barriers, false sharing detection and prevention, lock-free структуры данных, разные примеры happens before и т.д.

Самый лучший совет - книга advanced уровня. Спеку тоже нужно читать, но ведь я уже знаю о ее существовании, потому советовать нечего.

Статьи тоже сойдут, хотя я уже их начитался.

 

vertexua
()

Flex&Bisone конфликты

Форум — Development

Доброго времени суток. Не так давно изучаю bison и flex, поэтому нужна помощь. Есть задача описать входной язык Lua. Нашёл всю грамматику тут https://lua.org.ru/contents_ru.html. При сборке возникает ошибка, которую я никак не могу решить, помогите решить эту проблему. Собираю так: bison -d имя файла.y flex имя файла.l g++ -o имя lex.yy.c y.tab.c

Bison файл


%{
#include <iostream>
#include <string>
using namespace std;
void yyerror(char const* msg);
extern FILE *yyin;
int yylex();
%}

%union{
	std::string*		stringVal;
}
%verbose
%token <stringVal> LTOE GTOE TILDEEQUAL DEQUAL DSLASH DLESS DGREATER DPOINT TPOINT
%token <stringVal> NOT NIL FALSE TRUE RETURN
%token <stringVal> OR AND WHILE REPEAT UNTIL IF THEN ELSE ELSEIF
%token <stringVal> FOR IN FUNCTION LOCAL DO END GOTO BREAK DCOLON
%token <stringVal> NAME STRING STRINGG

%token INT HEX FLOAT

%left OR
%left AND
%left '<' '>' LTOE GTOE TILDEEQUAL DEQUAL
%left '|'
%left '~'
%left '&'
%left DLESS DGREATER
%right DPOINT
%left '+' '-'
%left '*' '/' '%' DSLASH
%left '#' NOT
%left UNARY
%right '^'

%start chunk

%%


chunk : block
;

block : stat | stat retstat
;

stat : /*empty*/  
	 | stat ';' 
	 | stat varlist '=' explist 
	 | stat functioncall 
	 | stat label 
	 | stat BREAK 
	 | stat GOTO NAME 
	 | stat DO block END 
	 | stat WHILE exp DO block END 
	 | stat REPEAT block UNTIL exp 
	 | stat IF exp THEN block statelseif elseblock END
	 | stat FOR NAME '=' exp ',' exp exz DO block END
	 | stat FOR namelist IN explist DO block END
	 | stat FUNCTION funcname funcbody
	 | stat LOCAL FUNCTION NAME funcbody
	 | stat LOCAL namelist 
	 | stat LOCAL namelist '=' explist
;

statelseif:							/*('elseif' exp 'then' block)* */						
	/*empty*/
	| statelseif ELSEIF exp THEN block
	;
	
exz
	:  /*empty*/
	| ',' exp
	;
	
elseblock
	: /*empty*/
	| ELSE block
	;

retstat
    : RETURN | RETURN explist | RETURN ';'
    ;

label : DCOLON NAME DCOLON

funcname
    : NAME np 
	| NAME np ':' NAME
    ;
	
np
	: /*empty*/
	| np '.' NAME
	;

varlist
    : var |varlist ',' var
    ;

var :  NAME | prefixexp '[' exp ']' | prefixexp '.' NAME 

namelist
    : NAME 
	| namelist ',' NAME
    ;

explist
    : exp 
	| explist ',' exp
    ;

exp :  NIL | FALSE | TRUE 
	| number 
	| string 
	| TPOINT 
	| functiondef 
	| prefixexp 
	| tableconstructor 
	| exp '^' exp		
	| NOT exp
	| '#' exp
	| exp '*' exp
	| exp '/' exp
	| exp '%' exp
	| exp DSLASH exp
	| exp '+' exp
	| exp '-' exp
	| exp DPOINT exp
	| exp '<' exp
	| exp '>' exp
	| exp LTOE exp
	| exp GTOE exp
	| exp TILDEEQUAL exp
	| exp DEQUAL exp
	| exp AND exp
	| exp OR exp
	| exp '&' exp
	| exp '|' exp
	| exp '~' exp
	| exp DLESS exp
	| exp DGREATER exp
	| '-' exp %prec UNARY
	| '~' exp %prec UNARY
	;

prefixexp : var | functioncall | '(' exp ')'

functioncall :  prefixexp args | prefixexp ':' NAME args 

args: '('/*empty*/')' 
		| '(' explist ')'
		| tableconstructor
		| string
;

functiondef : FUNCTION funcbody

funcbody: '('/*empty*/')' block END
		| '('parlist')' block END

parlist: namelist 
		| namelist ',' TPOINT
		| namelist TPOINT
;

tableconstructor: '{'/*empty*/'}'
		| '{' fieldlist '}'
;

fieldlist: field fieldlistREP
		| field fieldlistREP fieldsep
;
fieldlistREP: /*empty*/ 
		| fieldlistREP fieldsep field
;

field : '[' exp ']' '=' exp | NAME '=' exp | exp

fieldsep : ',' | ';'



number
    : INT | HEX | FLOAT
    ;
	
string
	: STRING | STRINGG
	;



%%
void yyerror(char const* msg) {}


int main() {

	yyin = fopen("bisontest.txt", "r");
    //yyparse();

    if (yyparse() == 0) {
        cout << "Success" << endl;
    } else {
		cout << "Syntax error" << endl;
	}
    return 0;
}

flex файл

 
%option noyywrap yylineno
%{
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include "bisondoc.tab.h"
using namespace std;
void showError();
int ch;

%}

%%
[ \t\r\n]+ 					{ /* игнорируем пробелы, табы и переносы строк */ }

"("				{return 40;}
")"				{return 41;}
"["				{return 91;}
"]"				{return 93;}
"{"				{return 123;}
"}"				{return 125;}
"<"			   	{return 60;}
">"			   	{return 62;}
","				{return 44;}
"."				{return 46;}
"+"			   	{return 43;}
"-"			   	{return 45;}
"*"			   	{return 42;}
"/"			   	{return 47;}
"="			   	{return 61;}
":"			   	{return 58;}
";"			   	{return 59;}
"%"			   	{return 37;}
"&"			   	{return 38;}
"|"			   	{return 124;}
"~"			   	{return 126;}
"#"			   	{return 35;}
"^"			   	{return 94;}
["]			   	{return 34;}
"'"			   	{return 39;}
"\\"			{return 92;}

"<="			{yylval.stringVal = new std::string(yytext, yyleng); return (LTOE);}
">="			{yylval.stringVal = new std::string(yytext, yyleng); return (GTOE);}
"~="			{yylval.stringVal = new std::string(yytext, yyleng); return (TILDEEQUAL);}
"=="			{yylval.stringVal = new std::string(yytext, yyleng); return (DEQUAL);}
"//"			{yylval.stringVal = new std::string(yytext, yyleng); return (DSLASH);}
"<<"			{yylval.stringVal = new std::string(yytext, yyleng); return (DLESS);}
">>"			{yylval.stringVal = new std::string(yytext, yyleng); return (DGREATER);}
".."			{yylval.stringVal = new std::string(yytext, yyleng); return (DPOINT);}
"..."			{yylval.stringVal = new std::string(yytext, yyleng); return (TPOINT);}

"not"			{yylval.stringVal = new std::string(yytext, yyleng); return (NOT);}
"nil"			{yylval.stringVal = new std::string(yytext, yyleng); return (NIL);}
"false"			{yylval.stringVal = new std::string(yytext, yyleng); return (FALSE);}
"true"			{yylval.stringVal = new std::string(yytext, yyleng); return (TRUE);}
"return"		{yylval.stringVal = new std::string(yytext, yyleng); return (RETURN);}
"or"			{yylval.stringVal = new std::string(yytext, yyleng); return (OR);}
"and"			{yylval.stringVal = new std::string(yytext, yyleng); return (AND);}
"while"			{yylval.stringVal = new std::string(yytext, yyleng); return (WHILE);}
"repeat"		{yylval.stringVal = new std::string(yytext, yyleng); return (REPEAT);}
"until"			{yylval.stringVal = new std::string(yytext, yyleng); return (UNTIL);}
"if"			{yylval.stringVal = new std::string(yytext, yyleng); return (IF);}
"then"			{yylval.stringVal = new std::string(yytext, yyleng); return (THEN);}
"else"			{yylval.stringVal = new std::string(yytext, yyleng); return (ELSE);}
"elseif"		{yylval.stringVal = new std::string(yytext, yyleng); return (ELSEIF);}
"for"			{yylval.stringVal = new std::string(yytext, yyleng); return (FOR);}
"in"			{yylval.stringVal = new std::string(yytext, yyleng); return (IN);}
"function"		{yylval.stringVal = new std::string(yytext, yyleng); return (FUNCTION);}
"local"			{yylval.stringVal = new std::string(yytext, yyleng); return (LOCAL);}
"do"			{yylval.stringVal = new std::string(yytext, yyleng); return (DO);}
"end"			{yylval.stringVal = new std::string(yytext, yyleng); return (END);}
"goto"			{yylval.stringVal = new std::string(yytext, yyleng); return (GOTO);}
"break"			{yylval.stringVal = new std::string(yytext, yyleng); return (BREAK);}
"::"			{yylval.stringVal = new std::string(yytext, yyleng); return (DCOLON);}


[a-zA-Z_][a-zA-Z_0-9]* 		{yylval.stringVal = new std::string(yytext, yyleng); return (NAME);}
\"[ -~]*\"					{yylval.stringVal = new std::string(yytext, yyleng); return (STRING);}
\'[ -~]*\'				    {yylval.stringVal = new std::string(yytext, yyleng); return (STRINGG);}

[0-9]+						{return (INT);}
0[xX][0-9a-fA-F]+ 			{return (HEX);}
([0-9]*\.[0-9]+|[0-9]+\.)	{return (FLOAT);}

.      			{showError(); return 0;}
%%


void showError(){
    printf("Other input\n");
}

 ,

LSTSnaiper
()

Liskov substitution

Форум — Development

Это про что? Зачем это нужно в С++?

 

Liz812
()

Почему IntelliJ так плохо работает?

Форум — Development

Сделал import cats.implicits._ и оно еле шевелится. Я не понимаю на какой ide вообще пишут люди на скала за зарплату? Или у них сервер с 2048 гигами, а они свою локальную идею с ноута к нему как то цепляют?

 ,

Miha
()

Есть ли настоящий C shell, а не csh?

Форум — Development

Все же csh, несмотря на название как-то не особо похож на Си. Интересно есть ли оболочки более близкие в своей похожести.

 ,

praseodim
()

OpenGL без привязки к окну?

Форум — Development

Сабж. Нужно нарисовать картинку (по пикселям), средствами OpenGL, но не привязываясь к окну. То есть рисовать надо в память и потом эту память отдать (записать в файл скажем).

Не привязываясь к окну - потому что X-сервера может не быть (зашли по ssh без -X).

Это вообще возможно? Все что нагуглилось, вроде вот такого,

http://renderingpipeline.com/2012/05/windowless-opengl/

все таки подразумевает что какой то X-сервер есть, насколько я понял, просто окно не отображается.

PS в этих вопросах я нуб, сорри;-(

 , , ,

AntonI
()

Анализ пользователей Common Lisp и Racket

Форум — Development

Common Lisp разрабатывался и используется в предположении, что пользователь программы — программист. Поэтому из языка намеренно исключены сложные для понимания конструкции (пользователь не обязательно квалифицированный программист), поэтому в языке мощнейший отладчик, позволяющий без остановки программы переопределять функции и вообще делать что угодно. Но из-за этого документация по большей части библиотек Common Lisp существует только в виде docstring и комментариев в коде (некоторые вообще считают, что код сам себе документация). Из-за этого обработка ошибок почти всегда оставляется на отладчик (главное сделать рестарт «перезапустить с последней итерации», а там пользователь сам разберётся). Из-за этого в программе проверяется только happy path (пользователь ведь «тоже программист»).

Racket разрабатывался и используется в предположении, что пользователь программы не программист, а задача разработчика написать программу так, чтобы она корректно работала при любых входных данных (если данные некорректны, то сообщала об этом в том месте, где данные были введены). Поэтому в языке эффективная библиотека для написания тестов, система контрактов на уровне модулей, макимально широкий спектр инструментов программирования (разработчик должен быть профессионалом!). Также реализована идея инкапсуляции: считается, что пользователь модуля не должен знать особенности реализации и, более того, не может в своём коде изменить функцию чужого модуля если это явно не разрешено разработчиком того модуля. Исходный код разумеется доступен, но его не требуется смотреть, чтобы использовать модуль. Достаточно документации. Поэтому реализована мощнейшая система документировния Scribble, а при реализации макроса есть возможность обеспечить указание на ошибки в коде, предоставленном макросу пользователем, не показывая потроха макроса.

И поэтому в Racket нет CLOS (есть как минимум две реализации, но не используются) - провоцирует заплаточное программирование (monkey patching), поэтому отладчик намеренно ограничен (если ты отлаживаешь программу, значит ты не знаешь как она должна работать!), поэтому нет разработки в образе (image based) - она провоцирует разработку через отладку (а значит непонимание программы и проверку только happy path).

Таким образом, Racket и Common Lisp несмотря на внешнее сходство являются очень разными языками. И я рекомендую писать на Racket, если только конечными пользователями программы не являются исключительно программисты на Common Lisp.

Взято с http://racket-lang.blog.ru/#post214726099

Хотелось бы знать, что по этому поводу думают пользователи ЛОРа. А также, мне кажется, что для Java и C++ будет где-то такая же разница.

 , ,

monk
()