Все потоки
Поиск
Написать публикацию
Обновить
114.14

Ненормальное программирование *

Извращения с кодом

Сначала показывать
Порог рейтинга

Будет ли полнофункциональный текстовый браузер жрать больше ресурсов, чем обычный, или же меньше?

Вот посмотрите: с одной стороны, не нужен даже мало-мальски точный рендер шрифтов. Вёрстку можно считать с точностью плюс-минус лапоть, лишь бы понять, что видимое, а что — нет. Нужно просто вычленить видимый текст, видимые изображения и в нужном порядке показать текст, перемежающийся ссылками на файлы изображений. До кучи можно забыть всю кастомизацию и даже куки хранить в оперативке, плюс размер виртуального экрана всегда один.

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

Короче, задача тянет уже на неплохой AI, не находите? О_о

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии5

В scala 3 есть свои context receivers и они не похожи на то что есть в Kotlin!

object PostConditions:
  opaque type WrappedResult[T] = T

  def result[T](using r: WrappedResult[T]): T = r

  extension [T](x: T)
    def ensuring(condition: WrappedResult[T] ?=> Boolean): T =
      assert(condition(using x))
      x
end PostConditions
import PostConditions.{ensuring, result}

val s = List(1, 2, 3).sum.ensuring(result == 6)

Разберу по строчкам:

opaque type WrappedResult[T] = T: непрозрачный тип. Внутри объекта PostConditions компилятор "знает" что это один и тот же тип, снаружи смотрит на них как на два разных типа. Это не даст перепутать тип с типом обёртки, и, например, случайно присвоить одно в другое.

def result[T](using r: WrappedResult[T]): T = r: функция, которая принимает неявный параметр откуда-то из контекста и возвращает его как нормальное значение.

extension [T](x: T):
def ensuring(condition: WrappedResult[T] ?=> Boolean): T = ....
extension метод, который принимает лямбду. Лямбда принимает неявный параметр, а метод ensuring его предоставляет.

val s = List(1, 2, 3).sum.ensuring(result == 6)Метод списка sum возвращает Int, для него вызывается вышенаписанный метод ensuring, в который передаётся лямба. внутри лямбды есть неявный параметр и потому там (и только там, больше нигде) можно вызвать функцию result, которая вернёт этот самый T.

В коде где-либо снаружи PostConditions объект типа WrappedResult[T] не получится создать.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Инженеры и разработчики Аапо Леметтинен, Владимир Осмехин и Георгий Марков смогли собрать и запустить самый большой в мире сумматор из домино. Авторы проекта также дали в ролике краткое объяснение о компьютерах из домино. Фактически это сумматор, который способен считать сумму двух 6-битных двоичных чисел.

На видео ниже компьютер из домино правильно посчитал сумму 59 и 19. В двоичном виде это 111011+10011.

Теги:
Всего голосов 6: ↑6 и ↓0+6
Комментарии0

На прошлой неделе в подреддите /r/gamedev появилась просьба порекомендовать движок для игры. Просящий создал игру в жанре хоррор, но разочаровался в своём текущем техническом решении и пытался найти движок получше.

Это мог быть рядовой пост на форуме по геймдеву — мало ли энтузиастов каждый день обсуждают свои процессы? Особенность случая в том, что хоррор автор проекта создал в виде презентации PowerPoint.

Это не шутка: в комментариях разработчик выложил трейлер своей игры. Геймплей Restless Evil сильно напоминает Five Nights at Freddy's. Отсутствие настоящего движения в 3Д-пространстве допускает реализацию в приложении для просмотра слайдов.

Как заявил автор, источником всех звуков в игре (включая музыку, шум фонарика и крики супостатов) был его собственный рот. Все анимации основаны на эффектах PowerPoint, 3Д не понадобилось.

Остряки в комментах посоветовали попробовать Google Slides, чтобы получился облачный мультиплеер. Более серьёзные ответы из треда — это известный свободный движок визуальных романов RenPy и открытый инструмент для интерактивных историй Twine.

Теги:
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

Реализация дружественных классов на Kotlin

Класс A объявлен в библиотечном модуле, свойства с модификатором internal доступны только внутри одного модуля:

class A {
    internal val foo: String = "bar"
}

interface AFriend {
    val A.foo get() = foo
}

Класс B объявлен в другом модуле, но получает доступ к свойству foo через расширение в интерфейсе AFriend.

class B : AFriend {
    fun printFoo() {
        println(A().foo)
    }
}

fun main() {
    B().printFoo() // print bar
}

Всего голосов 4: ↑4 и ↓0+4
Комментарии3

Вклад авторов