<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 23:25:54 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="C1L_hgWdO8rRGMbPjlPErkDA_UsPbVmsch7iD6HS4x7kgzSx9-OWqmdb4leCXDTZgMnQ4Qdapw7P_nhb89UEcA";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Данные | PHP: Построение абстракций</title>
<meta name="description" content="Данные / PHP: Построение абстракций: Пытаемся понять, что такое данные в рамках языка программирования и как строить структуру данных на примере pair">
<link rel="canonical" href="https://ru.hexlet.io/courses/php-sicp/lessons/data/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Данные">
<meta property="og:title" content="PHP: Построение абстракций">
<meta property="og:description" content="Данные / PHP: Построение абстракций: Пытаемся понять, что такое данные в рамках языка программирования и как строить структуру данных на примере pair">
<meta property="og:url" content="https://ru.hexlet.io/courses/php-sicp/lessons/data/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="E5mVaTwYUyiJT3BzQTVAQR5yQhHuOx_R9Y3jWYDotlX8SF5ezmb-SD8MVOtNOrA23ntvu-YM4XNIbXkN0u9ROw" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MywicHVyIjoiYmxvYl9pZCJ9fQ==--61c43d4881ca8feecc6f37dfafdc4e304f34b52f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzkzNSwicHVyIjoiYmxvYl9pZCJ9fQ==--06c469e64c9b6c8429a6a01edd20041dae30ce13/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20code%20testing-bro.png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T23:25:54.706Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"LYahYsZiCmHz2NL5LVrFt_I8GEiQL00GEsO5kyUcFSXCV2pVNBynAUWb9mEhVTXAMjU14pgYs6SvIyPHdxvySw","topics":[{"id":2367,"title":"Просто разрыв шаблона! ","plain_title":"Просто разрыв шаблона! ","creator":{"public_name":"Андрей Ашгалиев","id":60336,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":3899,"body":"Толи еще будет!)","topic_id":2367}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":3745,"title":"Прошу помощи. Не понятен принцип работы конструктора:\n```\n// remove\n```\nОн принимает на вход значения пары и возвращает лямбду которая в свою очередь принимает на вход другую лямбду (которую должны будут передать селекторы) и возвращает результат работы этой лямбды в кач. аргументов которой замыкаются значения пары.\n\nПри вызове селектора мы ему передаём возвращаемую конструктором лямбду, которая в свою очередь ждёт на вход другую лямбду от селектора.\nТ.е. мы \"скармливаем\" селектору функцию, которая ждёт, чтобы ей в свою очередь \"скормили\" другую ф-цию, в которую она замкнёт значения нашей пары и вернёт результат...\n\nКакой-то монстр получается! ))\nИ ведь всего-то где-то должно стоять ```return $x;``` & ``` return $y;``` ))","plain_title":"Прошу помощи. Не понятен принцип работы конструктора: // remove Он принимает на вход значения пары и возвращает лямбду которая в свою очередь принимает на вход другую лямбду (которую должны будут передать селекторы) и возвращает результат работы этой лямбды в кач. аргументов которой замыкаются значения пары. При вызове селектора мы ему передаём возвращаемую конструктором лямбду, которая в свою очередь ждёт на вход другую лямбду от селектора. Т.е. мы \"скармливаем\" селектору функцию, которая ждёт, чтобы ей в свою очередь \"скормили\" другую ф-цию, в которую она замкнёт значения нашей пары и вернёт результат... Какой-то монстр получается! )) И ведь всего-то где-то должно стоять return $x; & return $y; )) ","creator":{"public_name":"Владимир Тарановский","id":83372,"is_tutor":false},"comments":[{"creator":{"public_name":"Владимир Тарановский","id":83372,"is_tutor":false},"id":6228,"body":"Решено! Как всегда, всё просто. )\n> так и вызовите эту полученную в качестве аргумента функцию (f) с другой функцией (g)\n \nДействительно ) Я перепутал вызов ф-ции и её определение. Думал, что если ф-ция пришедшая как аргумент требует на вход другую ф-цию, то эту требуемую ф-цию надо вернуть(т.е. вернуть её определение)... это замкнутый круг получается какой-то. Вместо этого надо её ВЫЗВАТЬ передав ей то, что она хочет.\nСпасибо огромное за помощь! Ещё один шаг к вывиху мозга! ;)\n","topic_id":3745},{"creator":{"public_name":"Василий Колесников","id":81,"is_tutor":false},"id":6220,"body":"Да, всё так.","topic_id":3745},{"creator":{"public_name":"Aleksandrs Nastasins","id":103473,"is_tutor":false},"id":12224,"body":"Спасибо, благодаря вашим подсказкам удалось решить :)","topic_id":3745},{"creator":{"public_name":"Василий Колесников","id":81,"is_tutor":false},"id":6226,"body":"> Если мои рассуждения верны, почему не работает такой car?\n\nПотому что селектор должен вернуть значение, а вы возвращаете функцию. Более того - посмотрите внимательно на то что вы написали, вы создали функцию, которая на вход принимает аргумент (пару) и возвращает некую другую функцию, в определении которйо никак полученная вами пара не фигурирует, т.е. вы с тем же успехом могли бы ничего и не передавать в car, если не хотите там с этим чем-то что-либо сделать.","topic_id":3745},{"creator":{"public_name":"Владимир Тарановский","id":83372,"is_tutor":false},"id":6221,"body":"Я немного завис от такой ситуации: у меня селектор принимает как арг. ф-цию, которая в свою очередь ждёт от того же селектора на вход другую ф-цию...\nЯ потерял причинно-следств. связь )","topic_id":3745},{"creator":{"public_name":"Борис Дёмин","id":142192,"is_tutor":false},"id":20106,"body":"Спасибо! Сидел как истукан никак не мог понять в чем моя проблема)","topic_id":3745},{"creator":{"public_name":"Владимир Тарановский","id":83372,"is_tutor":false},"id":6223,"body":"Если мои рассуждения верны, почему не работает такой car?\n```\n// remove\n```","topic_id":3745},{"creator":{"public_name":"Василий Колесников","id":81,"is_tutor":false},"id":6224,"body":"> Я немного завис от такой ситуации: у меня селектор принимает как арг. ф-цию, которая в свою очередь ждёт от того же селектора на вход другую ф-цию... Я потерял причинно-следств. связь )\n\nПомните - я бездушный робот, я отвечаю только на вопросы, здесь вопроса нет. Не зря говорят, что правильно заданный вопрос содержит в себе 99% ответа.\n\nНо рекомендацию дать могу - если вам эта тема еще не понятна, и вы не можете легко в голове манипулировать такими абстракциями, то следует обязательно пользоваться ручкой и бумагой и пытаться записать, изобразить проиходящий процесс. Причем изобразить именно так, как вам удобно, как вы видите, тогда вы с большой долей вероятности сможете уловить эту *очень простую* связь. Да ваш селектор принимает на вход функцию (f), которая примимает в качестве аргумента функцию (g), так и вызовите эту полученную в качестве аргумента функцию (f) с другой функцией (g), такой чтобы попав сюда: `return $func($x, $y);` (здесь func - ваша функция g) вернула то что вам нужно.","topic_id":3745}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":3785,"title":"Я не понимаю логики решения этого задания. Объясните, пожалуйста. ","plain_title":"Я не понимаю логики решения этого задания. Объясните, пожалуйста. ","creator":{"public_name":"Maxim Topciu","id":67145,"is_tutor":false},"comments":[{"creator":{"public_name":"Nikita Antonenkov","id":49435,"is_tutor":false},"id":6339,"body":"У вас есть реализация конструктора пар, отличная от реализации из лекции, надо дописать код селекторов. Обратите внимание на возвращаемое значение функции `cons()`.","topic_id":3785},{"creator":{"public_name":"Maxim Topciu","id":67145,"is_tutor":false},"id":6389,"body":"Cons возвращает функцию, которая принимает на вход функцию, которая использует переданные параметры и возвращает функцию? \nCar принимает полученную функцию. И дальше у меня ломается мозг)\nА нет, есть просвет. Похоже на то, как мы возвращаем функцию, а потом присваеваем переменной эту функцию с одним параметром, а затем к другой переменной присваеваем эту функцию с другим параметром. И в результате у нас получается, что функция работает с обеими этими переменными. \n\n\n","topic_id":3785},{"creator":{"public_name":"Nikita Antonenkov","id":49435,"is_tutor":false},"id":6420,"body":"Разобрались? Да, верно, `cons()` возвращает функцию, которая принимает в качестве аргумента другую функцию и **вызывает** её с элементами пары в качестве аргументов.","topic_id":3785}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":8322,"title":"1) Тема \"Что такое данные?\" - не понял в чем тут ответ? Данные это car и cdr?\n2) Не понял, в чем смысл урока вообще, зачем это нужно и как это применить? Это просто экскурс в прошлое как такое работало?","plain_title":"1) Тема \"Что такое данные?\" - не понял в чем тут ответ? Данные это car и cdr? 2) Не понял, в чем смысл урока вообще, зачем это нужно и как это применить? Это просто экскурс в прошлое как такое работало? ","creator":{"public_name":"Roman","id":52272,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman","id":52272,"is_tutor":false},"id":16339,"body":"Вроде бы понял, попробую раскопать эту тему","topic_id":8322},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":16338,"body":"Неа, именно про то что такое данные. Данные определяются интерфейсом и его согласованностью, а не внутренней реализацией, именно об этом сказано в АТД.\n\nПонятно что в конкретной ситуации есть конкретная реализация, но это не влияет на интерфейс.","topic_id":8322},{"creator":{"public_name":"Roman","id":52272,"is_tutor":false},"id":16311,"body":"Я правильно понял, что тут речь идёт не о том \"что такое данные\", а о том, что такое данные в контексте абстрактного/функционального программирования?\n\nВ вики совсем иное определение.","topic_id":8322},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":16284,"body":"Данные это конструктор + селекторы, которые позволяют извлечь составные части. Внутреннее устройство не важно вообще, более того, как было показано в этом уроке, их можно сделать на замыканиях, без применения стуктур данных вообще. По сути речь идет про https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D1%8B%D0%B9_%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85\n\nИ это не экскурс в историю, это как раз фундамент, который не изменяется и не изменится никогда.","topic_id":8322}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":2647,"title":"Facepalm, я продолжаю серию жалоб, иду дальше тупо из-за любопытства с надеждой что дальше будет что то полезное..\nОбидно то что я хоть и менеджер но программирую и на php и на java мелкие вещи(да говнокодю) и вроде как мне курс должен быть понятен, а нефига! потому что у вас академическая манера объяснять! как будто я на физфаке оказался. Для студентов у которых мозг привык воспринимать простые вещи через фильтр терминов и \"мозгоеб\"(извиняюсь за мой французский) курс наверное подойдет, но все кто закончил универ давно и не учился на матфаке/физфак это АДДД!","plain_title":"Facepalm, я продолжаю серию жалоб, иду дальше тупо из-за любопытства с надеждой что дальше будет что то полезное.. Обидно то что я хоть и менеджер но программирую и на php и на java мелкие вещи(да говнокодю) и вроде как мне курс должен быть понятен, а нефига! потому что у вас академическая манера объяснять! как будто я на физфаке оказался. Для студентов у которых мозг привык воспринимать простые вещи через фильтр терминов и \"мозгоеб\"(извиняюсь за мой французский) курс наверное подойдет, но все кто закончил универ давно и не учился на матфаке/физфак это АДДД! ","creator":{"public_name":"Alexander Alexandryan","id":69662,"is_tutor":false},"comments":[{"creator":{"public_name":"Evgeniy Serbinov","id":49158,"is_tutor":false},"id":4467,"body":"Я тоже столкнулся по началу с такой же проблемой, поиск дополнительной информации ничего не дал. В любых источниках по данной теме все либо сложнее, либо так же. Сделал вывод: проще объяснить все это невозможно. Решение нашел простое: подробно, пошагово разбирать каждую функцию. Расписывать каждый вызов, каждую итерацию. Тогда становится понятно как это работает и как решать задачи в практике.","topic_id":2647},{"creator":{"public_name":"Rakhim D.","id":42197,"is_tutor":false},"id":4435,"body":"Вышел, и мы его пока обкатываем. Он называется \"Основы PHP\" → https://ru.hexlet.io/courses/php-basics\n\n\nЭтот курс является частью цикла курсов по профессии \"PHP-программист\" https://ru.hexlet.io/professions/php И мы советуем всем начинать этот цикл с самого начала и двигаться по порядку вперед :)\n","topic_id":2647},{"creator":{"public_name":"Владимир Фомин","id":20538,"is_tutor":false},"id":4436,"body":"Чёрт) Его я уже прошел, причем с легкостью, потому как 85 процентов уже знал до этого, но мне всё равно сложно понимать эти закрученные моменты из этого курса. Может что-то почитать? Есть какая-то литература по теме курса, основанная на PHP (ну или python на худой конец)?","topic_id":2647},{"creator":{"public_name":"Rakhim D.","id":42197,"is_tutor":false},"id":4437,"body":"Предлагаю подключиться к нашему чату http://slack-ru.hexlet.io/ и задать вопросы там. В чате много людей, готовых помочь разобраться, в том числе и сами авторы курсов.\n\nИз литературы советуем СИКП → https://mitpress.mit.edu/sicp/\n\n","topic_id":2647},{"creator":{"public_name":"Alexander Alexandryan","id":69662,"is_tutor":false},"id":4305,"body":"Вдвойне обидно, что я не новичек совсем в программировании, подписался у вас чтоб писать грамотный код, поднять уровень, но это не значит что я не понимаю ничего.. Все, пойду выпью пива и успокою нервы.\nP.S. Если что, я не со зла, просто не сдержался.","topic_id":2647},{"creator":{"public_name":"Rakhim D.","id":42197,"is_tutor":false},"id":4303,"body":"Здравствуйте, Александр!\n\nЯ понимаю вас. Этот курс на самом деле подходит далеко не всем, и мы неправильно его преподнесли как \"курс для всех, кто хочет начать программировать\". Но, к счастью, благодаря фидбеку пользователей (вроде вашего) мы вовремя поняли, что нужно это дело менять. Поэтому на следующей неделе мы выпустим по-настоящему вводный курс, который, надеюсь, понравится вам.\n\nМы напишем о новом курсе в наших соц сетях (ссылки в нижней части страницы).","topic_id":2647},{"creator":{"public_name":"Владимир Фомин","id":20538,"is_tutor":false},"id":4434,"body":"Рахим, а не вышел ли этот \"по настоящему вводный курс\", лично у меня тоже возникают проблемы с усвоением материала из текущего курса. ","topic_id":2647},{"creator":{"public_name":"Alexander Alexandryan","id":69662,"is_tutor":false},"id":4304,"body":"Я смотрел ваши лекции Рахим, и лично по мне вы объясняете интересней и понятней.\nвы не представляете просто как лично мне тяжело смотреть этот курс)) это смесь унижения, взрыва мозга, злобы и негодования...)","topic_id":2647},{"creator":{"public_name":"Rakhim D.","id":42197,"is_tutor":false},"id":4307,"body":"> P.S. Если что, я не со зла, просто не сдержался.\n\nЯ и не думаю что вы со зла, со зла полезных комментариев не пишут :) ","topic_id":2647},{"creator":{"public_name":"Rakhim D.","id":42197,"is_tutor":false},"id":4306,"body":"Мне не приходилось разрабатывать такой сложный курс, мои вводные курсы по другим дисциплинам это совсем другая история. Но так или иначе — мы берем все эти комментарии в обработку, делаем выводы и постепенно обновляем наши курсы. Хочу попросить вас оценить на следующей неделе тот новый курс и дать свои комментарии. Я могу вам напомнить в этом топике или даже написать на почту когда курс выйдет :)","topic_id":2647}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":3741,"title":"Перед прохождением этого курса нужно предупреждение: \"Опасно для психики\". Для новичков в программировании вроде меня это крайне опасный курс и демотиватор одновременно. Особенно обломно будет тем, кто успешно прошел курс \"Основы PHP\" и думает, что дальше пойдет что-то более практическое и понятное. \nЯ хоть и прошел уже пол курса и выполняю тесты сам, но тем не менее не покидает ощущение того, что тесты то я прохожу исходя из шаблона в видео, а на практике никогда бы до такого не додумался бы.\n\nМожет стоит этот курс в самый конец поставить, а не под номером 5 в профессии? \nС другой стороны, Кирилл пропагандирует СИКП для новичков, а ближе к концу курса до СИКП уже руки могут не дойти.\n","plain_title":"Перед прохождением этого курса нужно предупреждение: \"Опасно для психики\". Для новичков в программировании вроде меня это крайне опасный курс и демотиватор одновременно. Особенно обломно будет тем, кто успешно прошел курс \"Основы PHP\" и думает, что дальше пойдет что-то более практическое и понятное. Я хоть и прошел уже пол курса и выполняю тесты сам, но тем не менее не покидает ощущение того, что тесты то я прохожу исходя из шаблона в видео, а на практике никогда бы до такого не додумался бы. Может стоит этот курс в самый конец поставить, а не под номером 5 в профессии? С другой стороны, Кирилл пропагандирует СИКП для новичков, а ближе к концу курса до СИКП уже руки могут не дойти. ","creator":{"public_name":"Геннадий Николаев","id":100462,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":6602,"body":"Отлично) Надеюсь дальше пойдет легче.","topic_id":3741},{"creator":{"public_name":"Геннадий Николаев","id":100462,"is_tutor":false},"id":6601,"body":"Спасибо за совет по прохождению курса \"JS составные данные\"!\nМногое из того, что было непонятно, стало понятно!\nКурс \"JS составные данные\" просто супер! ","topic_id":3741},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":6202,"body":"Здесь ситуация следующая, когда курс писался, он не был рассчитан на полных новичков. Но с тех пор многое утекло. В данный момент его нельзя подвинуть (материал этого курса используется дальше), но у нас в планах его переписать.\n\nПрямо сейчас мы делаем новую профессию (javascript) и там учли эти ошибки. Дается плюс минус тот же материал, но сильно в другом стиле, с другими акцентами, и с другой разбивкой. Можете попробовать их пройти, они многое дадут для понимания.","topic_id":3741},{"creator":{"public_name":"Геннадий Николаев","id":100462,"is_tutor":false},"id":6222,"body":"\"Основы программирования\" я прошел, отличный курс! Причем хотя я его и прошел после \"Основы PHP\" - он даже мне больше дал, чем \"Основы PHP\".\nНаверное, \"Основы программирования\" это самый лучший ваш курс из тех что я прошел. ","topic_id":3741},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":6210,"body":"Только лучше сначала пройти \"основы программирования\". Не смотря на то что это основы, там есть некоторые крайне важные концепции, о которых обычно не рассказывают, плюс этот курс учит синтаксису нового стандарта js, это совсем не тоже самое что все привыкли видеть.","topic_id":3741},{"creator":{"public_name":"Геннадий Николаев","id":100462,"is_tutor":false},"id":6208,"body":"Спасибо за комментарий, были сомнения, стоит ли начинать курс \"JS составные данные\" или лучше сначала этот закончить.\nТеперь точно попробую JS, если вы говорите что он в другом стиле подается.","topic_id":3741}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":1650,"title":"Просто отличное задание! Рекомендую всем не пользоваться никакими подсказками и не подглядывать в решение - тогда рельно прокачаетесь.\nНикогда не программировал на php, и никак не изучал его кроме этого курса (в общеобразовательных целях), - на задание потратил примерно 2 минуты.","plain_title":"Просто отличное задание! Рекомендую всем не пользоваться никакими подсказками и не подглядывать в решение - тогда рельно прокачаетесь. Никогда не программировал на php, и никак не изучал его кроме этого курса (в общеобразовательных целях), - на задание потратил примерно 2 минуты. ","creator":{"public_name":"Василий Колесников","id":81,"is_tutor":false},"comments":[{"creator":{"public_name":"DGrachov","id":63916,"is_tutor":false},"id":2913,"body":"Главная фраза: \"Это не является хаком или трюком...\"\nЛовкость рук и никакого мошенничества))\nП.С. сори за оффтоп","topic_id":1650},{"creator":{"public_name":"","id":93925,"is_tutor":false},"id":4341,"body":"Унижение... Вот что я почувствовал, решая это задание. И это несмотря на то что в моем дипломе присутствует слово \"математик\". Матан, дифуры, линейка, и прочая высшая математика пошли прахом, мой мозг сломан окончательно. По ночам снятся функции, которые возвращают функции, которые возвращают функции. Мир больше не будет прежним. Наверно, мне не стать программистом... (все написанное, конечно, шутка, но лишь от части :))","topic_id":1650},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":4346,"body":"Кстати мы сегодня выложили новый курс по основам самого php и чуть-чуть поменяли структуру курсов. Посмотрите оглавление в профессии.","topic_id":1650}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":12389,"title":"Доброго всем здоровья! Решил задачку. НО! \n1. Про callable в курсе нету ничего. Если смотреть строго по порядку. Приходится много дочитывать в монуале. \n2. Если сказать в условиях задачи что: функция возврата значения из пары принимает лямбду, у которой ещё нету определения, и это определение должно возвращать то самое значение х или y, то это бы слегка прояснило головы учащихся. И люди бы более конкретно поняли что ИЗПОД них хотят. \n\nТоварищи менторы с превеликим уважением, не забывайте плз, это для вас очевидно, а для тех, кто перешёл только что с курса для бегинера - туман, он вжисть не решит такую загадку. ","plain_title":"Доброго всем здоровья! Решил задачку. НО! 1. Про callable в курсе нету ничего. Если смотреть строго по порядку. Приходится много дочитывать в монуале. 2. Если сказать в условиях задачи что: функция возврата значения из пары принимает лямбду, у которой ещё нету определения, и это определение должно возвращать то самое значение х или y, то это бы слегка прояснило головы учащихся. И люди бы более конкретно поняли что ИЗПОД них хотят. Товарищи менторы с превеликим уважением, не забывайте плз, это для вас очевидно, а для тех, кто перешёл только что с курса для бегинера - туман, он вжисть не решит такую загадку. ","creator":{"public_name":"Александр Тарасов","id":144988,"is_tutor":false},"comments":[{"creator":{"public_name":"Александр Тарасов","id":144988,"is_tutor":false},"id":26689,"body":"Ну вы хоть джилетом щетину общкаблите.))","topic_id":12389},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":26699,"body":"Спасибо за дополнение!","topic_id":12389},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":26685,"body":"В js будет сильно бодрее, уверяю). А мы сделаем php great again.","topic_id":12389},{"creator":{"public_name":"Sergei Melodyn","id":162475,"is_tutor":true},"id":26684,"body":"Боюсь, подписка кончится, если буду так медленно ползти по курсу. Но заглянуть на чашечку JS планирую тоже )","topic_id":12389},{"creator":{"public_name":"Sergei Melodyn","id":162475,"is_tutor":true},"id":26682,"body":"Просто пипецки сложный материал, имхо. И есть ощущение, что нарушена линейность обучения, потому что функции и их аргументы проходили в основах php, тут внезапно пишем \"hello, world\", а потом бросаемся в хардкорный callback. ","topic_id":12389},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":25811,"body":"Добрый день. Александр, вы правы, курс был написан не один год назад и с тех пор утекло много воды. Я прямо сейчас работаю над новыми версиями курсов по php. В течении полугода они обновятся. Мы даже сделали вот такой проект http://code-basics.ru/ для тех кто только совсем с нуля.","topic_id":12389},{"creator":{"public_name":"Sergei Melodyn","id":162475,"is_tutor":true},"id":26686,"body":"Работодатель сказал, что возьмёт меня, если я пройду курс по PHP, так что буду продолжать есть кактус )","topic_id":12389},{"creator":{"public_name":"Александр Тарасов","id":144988,"is_tutor":false},"id":26690,"body":"Кирилл, и если можно, то возьми на заметку. В курсе по ООП сделать, по возможности, урок или задания не сложные по обходу объекта со вложенными объектами в лямбде с аккумулятором и рекурсией. **И вообще**, большое вам спасибо за труды, и я буду продолжать, хочу закончить php полностью и получить сертификат ваш, конечно по деньгам накладно slightly, ну ничего растяну во времени проекты.","topic_id":12389},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":26683,"body":"Угу, я уже добрался практически до того чтобы его полностью обновить (2 года обещаю уже). В течении пары месяцев точно его обновлю. Пока рекомендую переключиться на js, там вся эта история гораздо проработаннее и плавнее. Так как делалась позже. Потом вы сможете вернуться сюда и уже без проблем прорешаете все задачи.","topic_id":12389}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":10954,"title":"Решением является неочевидная конструкция. Честно говоря так и не нашел в документации, где описаны текущие чудеса. Когда вдруг вместо аргумента вовнутрь запрыгивает функция и чудесным образом подхватывает аргументы. Можете как то пояснить этот момент .... в чем здесь особенность? (предыдущий пример ровно такой же)","plain_title":"Решением является неочевидная конструкция. Честно говоря так и не нашел в документации, где описаны текущие чудеса. Когда вдруг вместо аргумента вовнутрь запрыгивает функция и чудесным образом подхватывает аргументы. Можете как то пояснить этот момент .... в чем здесь особенность? (предыдущий пример ровно такой же) ","creator":{"public_name":"Gleb Daychman","id":154600,"is_tutor":false},"comments":[{"creator":{"public_name":"Gleb Daychman","id":154600,"is_tutor":false},"id":22860,"body":"Я понял. Ок.. спасибо. По немногу привыкаю. ","topic_id":10954},{"creator":{"public_name":"Gleb Daychman","id":154600,"is_tutor":false},"id":22888,"body":"Уже ...","topic_id":10954},{"creator":{"public_name":"Gleb Daychman","id":154600,"is_tutor":false},"id":22808,"body":"```\n// removed\n```","topic_id":10954},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22804,"body":"Добрый день. Приведите пожалуйста пример кода, я расскажу.","topic_id":10954},{"creator":{"public_name":"Gleb Daychman","id":154600,"is_tutor":false},"id":22823,"body":"Я имею ввиду что $pair это функция с двумя аргументами внутри изначально т.е. $pair($x, $y) мы вставляем фунцию вместо аргументов и фунция подхватывает эти аргументы. ","topic_id":10954},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22824,"body":"Она ничего не подхватывает, это просто определение функции. Внутри `$pair` она вызывается с двумя аргументами.","topic_id":10954},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22864,"body":"Я рекомендую пройти курс \"js функции\", там прямо вы прочувствуете эту тему.","topic_id":10954},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":22812,"body":"Что вы имеете ввиду под \"подхватывает аргументы\"? В текущем коде создается анонимная функция и передается в функцию `$pair`. Можно было бы и так записать:\n\n```\n// removed\n```\n","topic_id":10954}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}},{"id":7593,"title":"Добрый день после просмотра видео где вы с помощью функций сделали новый тип данных(pair) у меня возник вопрос какая тогда разница между классом и функцией как типами данных","plain_title":"Добрый день после просмотра видео где вы с помощью функций сделали новый тип данных(pair) у меня возник вопрос какая тогда разница между классом и функцией как типами данных ","creator":{"public_name":"Дмитрий Макух","id":106506,"is_tutor":false},"comments":[{"creator":{"public_name":"Дмитрий Макух","id":106506,"is_tutor":false},"id":14265,"body":"и еще одно мне кажется или действительно так есть что инкапсуляция в типе данных(pair) созданного с помощью функций лучше и понятнее (имею в виду она практически не может быть нарушенной) чем в класе с гетерами и сетерами ","topic_id":7593},{"creator":{"public_name":"Александр О.","id":61806,"is_tutor":false},"id":14337,"body":"Добрый день! На самом деле с помощью демонстрируемого в уроках способа (посредством функций) можно создавать объекты, обладающие всеми основными свойствами, присущими объектам, так как это понимается по меркам ООП. При этом вы правильно подметили про инкапсуляцию - то, каким образом она организована в тех же парах, резко ограничивает в возможности каких-либо своевольных мутаций данных. Можно сказать, что сама структура \"сопротивляется изменениям\" и настраивает (на интуитивном уровне) программиста на правильный порядок работы. \nКонечно, если смотреть на более низком, прикладном, уровне то различия между объектами, порождаемые разными способами, есть различия: например, классы при статической типизации не позволят использовать не существующие свойства, выдавая подробные и конкретные предупреждения, что не представляется возможной в данной реализации на функциях; так же в таких \"функциональных\" объектах невозможен автокомплит. Хотя это прикладные и частные особенности, всё же они довольно важны.","topic_id":7593}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Данные","entity_url":null,"active":true}}],"lesson":{"exercise":{"id":247,"slug":"php_sicp_data_exercise","name":null,"state":"active","kind":"exercise","language":"php","locale":"ru","has_web_view":false,"has_test_view":false,"reviewable":true,"readme":"### src/App/Solution.php\n\nВ текущем задании представлен другой способ реализации пар.\n\n* Допишите функцию `car()` основываясь на том как работает функция `cons()`.\n* Допишите функцию `cdr()` основываясь на том как работает функция `cons()`.\n","prepared_readme":"### src/App/Solution.php\n\nВ текущем задании представлен другой способ реализации пар.\n\n* Допишите функцию `car()` основываясь на том как работает функция `cons()`.\n* Допишите функцию `cdr()` основываясь на том как работает функция `cons()`.\n","has_solution":true,"entity_name":"Данные"},"units":[{"id":849,"name":"theory","url":"/courses/php-sicp/lessons/data/theory_unit"},{"id":851,"name":"quiz","url":"/courses/php-sicp/lessons/data/quiz_unit"},{"id":850,"name":"exercise","url":"/courses/php-sicp/lessons/data/exercise_unit"}],"links":[],"ordered_units":[{"id":849,"name":"theory","url":"/courses/php-sicp/lessons/data/theory_unit"},{"id":851,"name":"quiz","url":"/courses/php-sicp/lessons/data/quiz_unit"},{"id":850,"name":"exercise","url":"/courses/php-sicp/lessons/data/exercise_unit"}],"id":462,"slug":"data","state":"approved","name":"Данные","course_order":90,"goal":"Пытаемся понять, что такое данные в рамках языка программирования и как строить структуру данных на примере pair","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"136934425","theory":"## Полезные ссылки\n- [CAR and CDR / Wikipedia](https://en.wikipedia.org/wiki/CAR_and_CDR)"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":1211,"name":"theory","url":"/courses/php-sicp/lessons/intro/theory_unit"}],"links":[],"ordered_units":[{"id":1211,"name":"theory","url":"/courses/php-sicp/lessons/intro/theory_unit"}],"id":624,"slug":"intro","state":"approved","name":"Введение","course_order":0,"goal":"Знакомимся с курсом, декларативным программированием и других парадигмах","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"156405268","theory":""},"id":75,"slug":"php-sicp","challenges_count":5,"name":"PHP: Построение абстракций","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"paid","description":"На этом курсе вы познакомитесь с основами функционального программирования и понятием декларативного программирования. Вы узнаете, как использовать функции высшего порядка и работать с лямбда-функциями. Еще вы научитесь комбинировать функции, строить рекурсии с аккумулятором и оптимизировать хвостовую рекурсию.\nТакже вы изучите структуры данных и научитесь использовать функции высшего порядка: map, filter и свертка. Вы познакомитесь с концепцией разделения программы на функциональные блоки и научитесь работать с общей структурой данных.\nВ конце курса вы узнаете о присваивании и изменении состояния, а также о создании объектов. Вы рассмотрите преимущества и недостатки присваивания и сохранения состояния, чтобы лучше понимать, как использовать эти концепции в своих программах. Полученные знания помогут разрабатывать более эффективные и чистые программы.\nЭтот курс является адаптацией под php знаменитого курса «Структура и интерпретация компьютерных программ», который преподается на первом курсе МИТ (Massachusetts Institute of Technology) с 70-х годов.","kind":"additional","updated_at":"2026-01-20T11:55:16.759Z","language":"php","duration_cache":90240,"skills":["Применять функциональное и декларативное программирование","Создавать гибкие алгоритмы с помощью функции высшего порядка и лямбда-функции","Обрабатывать сложные задачи с помощью рекурсивных функций с аккумулятором","Улучшать читаемость, разделяя программу на модули и функциональные блоки","Обрабатывать коллекции данных с помощью структуры данных и функции высшего порядка"],"keywords":["абстрации","рекурсия","функции высшего порядка","интерфейсы","присваивание","свёртка"],"lessons_count":20,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6OTEzMSwicHVyIjoiYmxvYl9pZCJ9fQ==--3ba3584f2fa679f478641d2f93050edfe2ceb7e0/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--6067466c2912ca31a17eddee04b8cf2a38c6ad17/image.png"},"recommendedLandings":[{"stack":{"id":28,"slug":"php-sicp","title":"СИКП на PHP","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":4010,"duration_in_months":1},"id":44,"slug":"php-sicp","title":"СИКП на PHP","subtitle":"Навык понимать программы на глубоком уровне, уверенно проходить собеседования и решать сложные задачи","subtitle_for_lists":"Навык фундаментального понимания программ на PHP","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"php-sicp","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MywicHVyIjoiYmxvYl9pZCJ9fQ==--61c43d4881ca8feecc6f37dfafdc4e304f34b52f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png"},{"stack":{"id":39,"slug":"php-phpunit-testing","title":"Автоматизация тестирования на PHP","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":1900,"duration_in_months":4},"id":66,"slug":"php-phpunit-testing","title":"Автоматизация тестирования на PHP","subtitle":"Навык написания тестов и применения продвинутых подходов, повышающий качество кода","subtitle_for_lists":"Навык тестирования на PHP","locale":"ru","current":true,"duration_in_months_text":"4 месяца","stack_slug":"php-phpunit-testing","price_text":"от 3 900 ₽","duration_text":"4 месяца","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzkzNSwicHVyIjoiYmxvYl9pZCJ9fQ==--06c469e64c9b6c8429a6a01edd20041dae30ce13/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20code%20testing-bro.png"}],"lessonMemberUnit":null,"accessToLearnUnitExists":false,"accessToCourseExists":false},"url":"/courses/php-sicp/lessons/data/theory_unit","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">PHP: Построение абстракций</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Данные</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Данные","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"PHP: Построение абстракций"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><h2 id="heading-2-1">Полезные ссылки</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://en.wikipedia.org/wiki/CAR_and_CDR" rel="noopener noreferrer" target="_blank">CAR and CDR / Wikipedia</a></li>
</ul></div><div style="margin-block:var(--mantine-spacing-xl)" class=""><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md)" class="m_8a5d1357 mantine-Title-root" data-order="2">Рекомендуемые программы</h2><style data-mantine-styles="inline">.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_2mremqrdub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php-sicp?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">1 месяц</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">СИКП на PHP</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык фундаментального понимания программ на PHP</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzc2MywicHVyIjoiYmxvYl9pZCJ9fQ==--61c43d4881ca8feecc6f37dfafdc4e304f34b52f/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20engineer-bro.png" alt="СИКП на PHP" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php-phpunit-testing?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">4 месяца</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Для продвинутых</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Автоматизация тестирования на PHP</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Навык тестирования на PHP</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzkzNSwicHVyIjoiYmxvYl9pZCJ9fQ==--06c469e64c9b6c8429a6a01edd20041dae30ce13/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Software%20code%20testing-bro.png" alt="Автоматизация тестирования на PHP" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 3 900 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-sicp/lessons/data/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 20</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-sicp/lessons/data/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>