New Reply
Name
×
Email
Subject
Message
Files Max 5 files10MB total
Tegaki
Password
[New Reply]


68747470733a2f2f64336b6f3533337475316f7a66712e636c6f756466726f6e742e6e65742f636c69636b73746172742f65726c616e672e706e67.png
[Hide] (16.5KB, 256x232)
Стоит ли рассматривать более подробно данный ЯП?
Стоит. В общем, если хочешь сделать многопоток - отличный выбор.
Таки решился на изучения Erlang. 
Для лучшего запоминания и понимания его фич - буду резюмировать итт свой путь изучения от базовых принципов до создания полноценного проекта. Я ведь знаю, насколько это всем интересно
test

language: erlang
 [2+n || n <- [1, 2, 3, 4]]
Replies: >>49
1672271347244-0.png
[Hide] (3.7MB, 2400x2400)
Базовые типы и структуры данных: переменная, атом, кортеж, список

--- имена переменных всегда пишется с большой буквы. Переменные нельзя изменить после присваивания им значения.
--- атомы - такие структуры, которые "обозначают сами себя". Их можно только сравнивать. Некоторые атомы, например такие как: div, case, catch, rem, ... - являются зарезервированными словами языка и недоступны для применения в качестве пользовательских атомов.
--- кортежи можно сопоставлять. Пример:
 erl
Points = {5, 6}.
{X, Y} = Points.
 
Из чего следует что:
X = 5; Y = 6;

--- Списки могут хранить в себе любые данные. Также, структура списка состоит из головы и хвоста, типа [Head|Tail]. К примеру, в списке, содержащем атомы [some, atoms, in, list], головой будет являться some, a остальные атомы будут хвостом
[some|[atoms, in, list]].
Cписки могут быть регулярными и нерегулярными:
[1|2]. % нерегулярный список
[1|[2]]. %регулярный
Вытащить голову и хвост можно встроенными функциями hd и tl
Replies: >>50
>>47


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

прошу отнестись с пониманием
Replies: >>50
1666371366233-0.jpg
[Hide] (272.4KB, 810x1080)
>>48
Разметка [code] проёбана. Да и хуй с ним

Операторы: and, or, xor, not.
Операторы сравнения: =:=, =/=, ==, /=, =<, >=, >, <.
битовые операторы: band, bor, bxor, bnot, bsr, bsl (последние два - операторы сдвига).
Операторы списков: ++, --. Несколько идущих оператов будут исполняться справа налево.



правильный порядок любых элементов для сравнения будет таким: числа < атомы < ссылочные значения < функции < порты < индентификаторы процессов < кортежи < списки < двоичные данные

>>49
Вас понял. В следующий раз постараюсь воздержаться от такого.
Генераторы: двоичные и списка. Имеют структуру
NewList = [Выражение || Генератор1, Генератор2,..., ГенераторN. Условие1, Условие2,..., УсловиеM]

language: erlang
% общий вид двоичного генератора в литературе, которую я читаю, не приводится. Поэтому напишу здесь усреднённый вид генератора, чтобы понимать потом.
[X || <<X>> <= <<1, 2, 3, 4, 5>>, X rem 2 == 0].
ClipboardImage.png
[Hide] (41.4KB, 583x418)
Продолжаем.
Это код простого udp-сокета. Решил немного уйти дальше просто посмотреть. Очень доставил встроенная бесконечная функция loop.
Replies: >>56
>>55
Расширенный код сокета. Объединён с tcp-сокетом в один файл. Оба сокета запускаются параллельно.

-module(socket_server).
-export([start/0]).

start() ->
    TcpPort = 1337,
    UdpPort = 1488,
    TcpOptions = [{active, false}, {reuseaddr, true}],
    UdpOptions = [{active, false}, {reuseaddr, true}],
    {ok, TcpSocket} = gen_tcp:listen(TcpPort, TcpOptions),
    {ok, UdpSocket} = gen_udp:open(UdpPort, UdpOptions),
    io:format("TCP server started and listening on port ~w~n", [TcpPort]),
    io:format("UDP server started and listening on port ~w~n", [UdpPort]),
    spawn(fun() -> accept_tcp_connections(TcpSocket) end),
    spawn(fun() -> receive_udp_data(UdpSocket) end).

accept_tcp_connections(Listen) ->
    case gen_tcp:accept(Listen) of
        {ok, Socket} ->
            io:format("TCP connection accepted from ~w~n", [inet:ntoa(Socket:peername())]),
            spawn(fun() -> handle_tcp_connection(Socket) end),
            accept_tcp_connections(Listen);
        {error, closed} ->
            ok;
        {error, Reason} ->
            io:format("Error accepting TCP connection: ~w~n", [Reason]),
            accept_tcp_connections(Listen)
    end.

handle_tcp_connection(Socket) ->
    case gen_tcp:recv(Socket, 0) of
        {ok, Data} ->
            io:format("Received TCP data: ~w~n", [Data]),
            gen_tcp:send(Socket, Data),
            handle_tcp_connection(Socket);
        {error, closed} ->
            gen_tcp:close(Socket);
        {error, Reason} ->
            io:format("Error receiving TCP data: ~w~n", [Reason]),
            gen_tcp:close(Socket)
    end.

receive_udp_data(Socket) ->
    case gen_udp:recv(Socket, 0) of
        {ok, Data, Addr, Port} ->
            io:format("Received UDP data: ~w~n", [Data]),
            gen_udp:send(Socket, Addr, Port, Data),
            receive_udp_data(Socket);
        {error, closed} ->
            ok;
        {error, Reason} ->
            io:format("Error receiving UDP data: ~w~n", [Reason]),
            receive_udp_data(Socket)
    end.

Replies: >>57
>>56
В будущем применимый для этого сокет-сервера модуль с использованием mysql

-module(db).
-export([connect/0, insert_user/2, insert_log/3]).

connect() ->
    mysql:start_link([{host, "localhost"}, {user, "root"}, {password, "password"}, {database, "chatgpt_db"}]).

insert_user(Username, Password) ->
    mysql:query(mysql:prepare(<<"INSERT INTO users (username, password) VALUES (?, ?)">>, [Username, Password])).

insert_log(FromUser, ToUser, Message) ->
    mysql:query(mysql:prepare(<<"INSERT INTO message_logs (from_user, to_user, message) VALUES (?, ?, ?)">>, [FromUser, ToUser, Message])).

Сама sql-схема прилагается.
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL
);

CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sender_id INT NOT NULL,
    receiver_id INT NOT NULL,
    message TEXT NOT NULL,
    sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (sender_id) REFERENCES users(id),
    FOREIGN KEY (receiver_id) REFERENCES users(id)
);

CREATE TABLE connections (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    protocol VARCHAR(10) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

[New Reply]
Connecting...
Show Post Actions

Actions:

Captcha:

- feedback - news - rules - faq -
jschan 1.4.1