ООП в R
Я думал, нет, даже надеялся, что присваивания в «Эр» единственная запутанная вещь.
Я надеялся, что это отражение некой эволюции, но нет, некоторые апологеты языка рекомендуют использовать разные реализации в разных случаях, говорят, что каждая из систем несёт в себе определённые удобства.
Удобства я пока не ощутил, каждая из система плоха, на мой вкус, зато изучая здешние объектные модели, наткнулся на интересное.
Каждая функция создаёт, как обычно, свою зону видимости, насколько я понял, тут она зовётся «окружением», причём из вложенной функции можно обращаться в окружения выше, если я правильно понимаю, сколь угодно далеко, пока не упрёшься в глобальное окружение — верхний уровень программы.
Самое интересное, что окружениями можно манипулировать — это обычные объекты, которые содержат в себе текущие переменные. В итоге сэмулировать собственный класс без затей и претензий можно вот так:
NewCat <- function() {
phrase <- 'Meow'
say <- function() {
print(phrase)
}
environment()
}
cat = NewCat()
cat$phrase # Meow
cat$say() # MeowВ «Эр» функции возвращают последнее значение, тут последним создаётся объект окружения, который возвращает в себе свою зону видимости и с которым можно работать как со списком (доллар — такой синтаксический сахар обращения к элементу списка).
При желании достаточно многое можно сделать с таким подходом (наследование, например), но я всё же буду изучать более естественные способы создания объектов.
Тридцать шестой выезд за монетами
Довольно неплохо в этот раз. Царские монеты: денга 1747, копейка 1858, копейка 1859, 2 копейки Александра I, 2 копейки 1915. Ранние советы: 5 копеек 1928, 10 копеек 1929 (серебро), 2 копейки 1930, 3 копейки 1932, 2 копейки 1936, 3 копейки до 1961.
Остальное: тупоконечная пуля, медное кольцо, пуговица красноармейца,
Электросамокаты в Айя-Напе
Хочу передать привет туристической Казани из туристической
Рассекали с ветерком, дочь в восторге — всё время оборачивалась на меня, не могла поверить счастью, в конце крепко обняла, что нужно ещё отцу для счастья? Очень бы хотелось, чтобы
Технических характеристик не знаю, но разгоняется до вполне приличной скорости даже в гору — быстрее уже и не надо, за час прогулки аккумулятор не потерял ни одного деления. Час прогулки обошёлся в €10.
Панмировые боги
Мы тут решили расширить дочке музыкальный репертуар, а то в последнее время у неё наметились явные фавориты и мы
Пока слушали, мне подумалось, что это была отличная заставка для для альтернативной версии сериала «Американские боги» (снят по книге Нила Геймана). Песня, безусловно, противоположна по смыслу, но затрагивает ту же тему.
То и другое произведение упоминает массу богов, но с разных сторон — песня
В сериале конфликт между старыми богами — то, чему люди
Вполне возможно, что Гейман проглядел эту идею или принёс её в жертву сюжету —
Честно сказать мне с такой мыслью трудно согласиться.
Может это и слишком наивно, когда на Часах Судного дня 2,5 минуты до полуночи, но мне кажется, что любовь, семья, человечность, взаимопомощь, доброта — всё это в большой цене и сейчас, эти старые боги (давайте придерживаться этого термина) могут спать спокойно — людским вниманием они будут обеспечены всегда.
Да и новые боги всё же лучше многих старых — куда более мягкие, податливые, демократичные. Вряд ли интернет стал бы так популярен в наше время, если бы требовал кровавых жертв перед каждым к нему подключением. Интернет вообще один из самых приятных богов — даже
Да, новые боги требуют ценнейшего ресурса — времени (как будто старые не требовали), но и давать способны немало, это уже вопрос собственных целеустремлений того, кто к ним обращается.
Аналог defer в языке R
В Гоу есть интересная конструкция (defer) — её содержимое выполняется, когда заканчивает работу функция, в которой эта конструкция объявлена, очень удобно память освобождать или другие ресурсы. Я накидал небольшой пример, чтобы было понятно:
package main
import (
"bufio"
"fmt"
"os"
)
func readFile(filename string) (out []string) {
file, _ := os.Open(filename)
defer file.Close()
b := bufio.NewReader(file)
for {
if str, err := b.ReadString('\n'); err != nil {
break
} else {
out = append(out, str)
}
}
return out
}
func main() {
var lines []string
for _, line := range readFile("/etc/passwd") {
if line[0] != '#' {
lines = append(lines, line)
}
}
fmt.Println(lines)
}В примере одна функция построчно читает файл и возвращает массив строк. Её использует основная функция (main), чтобы прочитать файл с информацией о пользователях в системе, удалив оттуда комментарии — строки, начинающиеся с «#». Обработку ошибок я не стал делать — и без этого длинновато вышло.
В фунции чтения файла блок defer вызовется как только мы покинем функцию и закроет используемый файл. Такой способ лучше, чем отсутствующий «Гоу» блок try…finally, так как позволяет указать способ освобождения ресурса очень близко к началу его использования.
Есть языки, которые, на мой взгляд, решают эту задачу ещё лучше (например, Пайтон со своим with), но у Гоу своя атмосфера и выбранное решение отвечает духу языка.
«Эр» на «Гоу» совсем не похож, у языков совершенно разные идеологии, поэтому я очень удивился, обнаружив в «Эр» тот же подход, что выбран в «Гоу».Тот же пример на «Эре»:
readFile <- function(filename) {
f <- file(filename, 'r')
on.exit({
close(f)
})
return(readLines(f))
}
lines <- readFile('/etc/passwd')
print(lines[!grepl('^#', lines)])Конструкция on.exit делает тут ровно то же, что defer в «Гоу». Нельзя не заметить, что программа стала гораздо компактнее, но в многословности Гоу обвинить нельзя —
Интерпретатор Brainfuck на языке R
В качестве упражнения написал тривиальный интерпретатор «Брейнфака» на языке «Эр», никаких оптимизаций, кроме преподсчёта переходов. Даже на версию без поддержки вложенных циклов ушло прилично времени — некоторые вещи у меня пока со скрипом идут. Зато воспользовался разными структурами данных и сделал класс на RC (в языке «Эр» три встроенных способа работы с классами).
Снова Дыбонины
У меня несколько лет назад в дереве завелись Дыбонины — один из моих многочисленных прапрапрапрапрадедов носил, как оказалось, такую фамилию. Я очень хотел, чтобы у меня в дереве появилась
Никак не могу найти откуда же они появились, напряг курских исследователей —
Поэтому каждая бумага с этой фамилией у меня на вес золота. И вот недавно в самарском архиве нашлась запись о смерти отставного рядового Петра Фёдоровича Дыбонина — брата моего
Это хорошо, что фамилия ещё
«Гугл» частично заблокирован в России
Если вы сегодня испытываете трудности с поиском в «Гугле», то воспользуйтесь его нидерландским адресом, он работает, основной же «Роскомнадзор» сегодня внёс в реестр запрещённых сайтов.
Честно сказать, представить себе интернет без «Гугла» я не могу, какой счастье, что есть (пока?) обходные пути позволяющие им пользоваться несмотря на внесение в реестр. Надеюсь блокировка — недоразумение и всё вернётся на круги своя.
Можно ли найти монету на газоне?
За время, которое я занимаюсь прогулками с металлоискателем, я уже несколько раз находил монеты чисто визуально, на поверхности — их просто постепенно выбивает дождём из земли.
Меня всегда интересовало — возможно ли найти монету на обычном городском газоне. Речь, конечно, не о «ходячках» — современных монетах, они мне постоянно попадаются,
С этой мыслью я уже пару лет внимательно обшариваю газон глазами во время прогулок.
И вот на этой неделе повезло наткнуться на ранние «советы» — мельхиоровые десять копеек 1945 года. Монету пришлось обтравить от медных окислов, до этого она была куда темнее и почти не читалась.
Считаю эксперимент удавшимся, но поглядывать на газоны не перестану — вдруг ещё
Погодный плагин для «Sublime Text» ★
Написал свой первый плагин для «Саблайма» — для отображения в строке состояния погоды и пробок «Яндекса». Заодно немного повспоминал «Пайтон», давно на нём ничего не писал.
Удивительно, но факт — другого работоспособного плагина на эту тему не обнаружилось. Единственный конкурент использует старое АПИ «Яху», которое уже не работает, потому не работает и плагин.
Отдельное спасибо «Яндексу» за то, что их АПИ умеет определять текущее местоположение — ничего задавать в конфиге не надо, удобно.
Поскольку в строке состояния можно выводить только буквы, воспользовался Юникодом для вывода погодных значков, для уровня пробок не нашлось ничего лучше фруктов, так что индикатором загруженности дорог у меня служат зелёное яблоко, жёлтый лимон и красный помидор. Не знаю будут ли видны эти символы пользователям Линукса или Виндоуза, мне негде посмотреть.
Пришлось повозиться с АПИ самого «Саблайма».
В настройках есть шаблон вывода, можно убрать пробки или погоду, если они не нужны.
Подал пул реквест на включение в саблаймовский пакетный менеджер, но особо упорствовать не буду, если откажут.
Применил «R» на практике
Каждый год я стараюсь, если не выучить, то познакомиться с одним или несколькими языками программирования. В основном, чтобы прочувствовать
Научившись их применять в языке, растёшь как профессионал, приобретаешь новые навыки и новые способы мышления. Стараюсь выбирать языки именно с таким прицелом, и если этого не происходит, испытываю сожаление от потраченного времени.
Тем не менее, не чураюсь применения языков на практике, в работе. Так в «Яндексе» я внезапно несколько лет попрограммировал на «Пайтоне», который выучил по забытой соседом на общей кухне книжке, а на текущем месте работы написал специализированную СУБД на «Гоу».
А вчера случилось написать по работе строчку на языке «Эр» (который я сейчас изучаю), всего одну, но полезную — нужно было посчитать различные квантили по количеству страниц на документ, программа с результатом на скриншоте — там загружается файл, где разделитель полей — точка с запятой, из загруженных данных выбирается второй столбец и считаются указанные квантили.
Новый экспонат в музей: НПЛ-М
Тема полётов для меня терра инкогнита и я даже не подозревал, что пилоты в полёте пользуются
Планшет удерживался на колене лётчика при помощи специального ремня и использовался
Что интересно, судя по форумам, пилоты малой авиации до сих пор охотно используют советские планшеты, подобные этому — говорят они очень удобные. Вроде как на складах ДОСААФ ещё осталось достаточное количество и есть
Находки на газонах
Необычно и непонятно для меня сталкиваться с людьми, которые ничего не испытывают к истории. Нет, они вполне любят истории — сопутствующий текст, но в старинных домах они видят развалюхи, а в том, что на снимке — мусор.
Но это было отступление. Тема внимательного осмотра газонов принесла ещё плоды — 2 копейки 1936, 20 копеек 1956, апекарский пузырёк с надписью «Вильна 30» (так назывался Вильнюс до 1918 года) и гильзу от винтовки Мосина, я её сильно протравил, чтобы посмотреть год, но разглядел только цифру «17», неясно что это — то ли 1917 год, то ли маркировка Подольского завода.
А ещё мои хорошие знакомые позвали меня покапаться на их огородике, прямо после работы, благо от работы к ним ехать недалеко. У них я нашёл 2 копейки серебром 1839—48 гг. и совершенно стёртый медяк, по диаметру аккуратно совпадающий с копейкой Александра III или Николая II. На медяшке уже ничего не разглядеть, а 2 копейки я попробую потравить, может проступят ещё детали.