Анна
ну библиотечные надо курнуть просто
Анна
я щас на могу пока
Ayrat
не, в библиотечных там уже stream-map, stream-take и пр реализованы
Анна
Ayrat
я думал их надо самому сделать. непонятно что стримы сами тоже надо было самому делать
Анна
хотя не знаю, может запретить надо либу юзать 🤔
Ayrat
в либе уже почти всё готово, да
Анна
так не интересно
Ayrat
(define (stream-map f s)
(if (stream-empty? s)
empty-stream
(stream-cons (f (stream-first s)) (stream-map f (stream-rest s)))))
Ayrat
т.е. вот так я stream-map сделал
Ayrat
stream-empty? есть
empty-stream есть
stream-rest и пр тоже есть
Ayrat
:D
Ayrat
окей, их надо короче все руками сделать заново. Понял тебя
Roman
пора чатик racket-flood заводить
Vasily
Это пройдет
Ayrat
если оставить лазейку, то например задача выше:
(1) Напишите функцию stream-for-n-steps, которая принимает стрим s и число n, и возвращает список из первых n значений, порождённых стримом. Считайте, что n неотрицательное.
делается так:
(define (stream-for-n-steps-fake s n)
(stream->list (stream-take s n)))
Vasily
Это Айрат просто начинает по родине тосковать
Анна
Ayrat мы всех достали 😭
Vasily
В личку не ходите, а то мало ли что
Ayrat
я к тому что с лазейкой в виде стд либы racket/stream там бОльшая часть задач тривиально решается библовскими функциями
Анна
Да, пусть страдают
Анна
идея была в том, чтобы заставить их вывернуть мозг наизнанку
Ayrat
Мда)
Ayrat
тогда скажи, как объявить стрим? я не понял как вернуть лейзи функцию в ракете
Анна
Может правда в личку 🤔
Vasily
Ненене
Vasily
Лично мне очень интересно
Éminence grise
Согласен с предыдущим оратором
Ayrat
А, я могу ж в лямбду завернуть начало и хвост
Анна
Ну вот пример - стрим натуральных чисел:
(define nats
(letrec ([f (lambda (x)
(cons x (lambda () (f (+ x 1)))))])
(lambda () (f 1))))
Внутри спрятана функция, которая каждый раз возвращает пару из значения и новой функции (которая как рекурсия, только наоборот). А наружу мы возвращаем функцию, которая начинает всю эту балалайку 🤔
Ayrat
и начало в лямбду, и хвост
Ayrat
Анна
А вообще чтобы сделать любое выражение ленивым, надо просто в лямбду его завернуть, а чтобы зафорсить вычисление - вызвать эту лямбду. На этой теме вся ленивость строится в языке с eager семантикой
Ayrat
это логично, просто мне типы суммы мозг сломали и я в чистых лямбдах думать перестал
Ayrat
как будто я когда-то начинал)))
Roman
@AnutaU Ayrat а почему лисп кстати? Почему не раст, например?
Ayrat
Ayrat
да не, раст голову не ломает
Ayrat
просто поэтому
Roman
раст скучно?
Roman
хм, там же вроде концепции, не характерные для других языков
Roman
типа borrowing
Roman
ну или я чего-то не знаю
Éminence grise
Ну не скажи Rust ломает.
Ayrat
ну линейные типы да, но это не уникальная концепция, шаред поинтер, уник поинтер, вот это вот всё
Анна
при этом он максимально простой и концентрированный. А ещё это lingua franca для теории языков программирования
Roman
Roman
я пока не могу пробиться через неприязнь к скобкам. Жутко нечитабельно имхо
Анна
каких например?
Те же лябды с замыканиями уже при мне стали появляться в мейнстриме
Ayrat
Éminence grise
А вообще ваш разговор про стримы в лиспе натолкнул меня на задачку - как семантически тоже реализовать на FSharp. Очень интересно получается.
Roman
а его в промышленном смысле кто-нить использует ща?
Ayrat
Roman
там тоже скобочки?)
Анна
Roman
а, эт я видел. Но она про лисп, а не кожу!
Анна
Roman
но я уже понял ответ
Крылатый
Анна
Я в каком-то внезапном порыве зимой купила себе книжку по кложе. Потом порыв прервался 🤷♀️
Roman
на какой странице?
Анна
Я в нескольких местах её читала, не только начало.
Анна
потом стало не до Кложи внезапно
Крылатый
Крылатый
Там есть матан, который я не шарю((
Анна
Не, все непрочитанные книжки я пожалуй не буду вспоминать
Анна
вот щас времечко освободится и ботанить можно будет
Vladislav
Анна
sicp я у товарища одалживала и немного читала, но всё не осиливала
Анна
вот то, что Ayrat сейчас решает, частично под SICP придумано
Igor
@AnutaU и снова призываю :D
Напишите функцию funny-number-stream, которая похожа на стрим натуральных чисел за исключением того, что все числа, кратные 5 - отрицательные (то есть 1, 2, 3, 4, -5, 6, 7, 8, 9, -10 ...).
(define (funny-number-stream)
(define (s n)
(let [head
(if (= (remainder n 5) 0)
(* -1 n)
n)]
(stream-cons head (s (+ n 1))))))
(funny-number-stream)
кидает странную ошибку
begin (possibly implicit): no expression after a sequence of internal definitions in: (begin (define (s n) (let (head (if (= (remainder n 5) 0) (* -1 n) n)) (stream-cons head (s (+ n 1))))))
Это scheme?
Ayrat
Igor
ракет
А типы там выводятся или надо явно писать?