Введение в расширения Ruby на C

Ruby – это замечательный язык программирования, приобретающий всю большую популярность в последнее время. Наверное, вы знакомы с Ruby, раз принялись читать эту статью. В противном случае вам сначала лучше познакомиться с информацией, представленной на официальном сайте www.ruby-lang.org, прежде чем приступать к чтению. Читать далее

Утиная типизация в Java

Если что-то ходит как утка, и крякает как утка, то будем относиться к этому как к утке. Так неформально описывается принцип утиной типизации (Duck Typing). Утиная типизация «развязывает нам руки», позволяя полиморфно работать с объектами, которые не связаны в иерархии наследования, но имеют необходимый набор методов. Здесь мы подходим к извечному спору о том, что лучше – динамическая или статическая типизация. Обойдём его стороной, сославшись на известную статью Мейера и Дрейтона под названием «The End of the Cold War Between Static and Dynamic Languages», и лучше посмотрим, как реализовать «утиное» поведение на Java.

Читать далее

Бесконечные последовательности в C#

Компьютеры – в общей массе своей, штуки дискретные. Поэтому мы не можем сказать – дайте мне последовательность чисел Фибоначчи, и работать с ней, не указав необходимую её длину. Ну, на самом деле мы можем вычислять эту последовательность динамически, при каждой потребности в следующем элементе (пока у нас хватает памяти), создавая иллюзию бесконечности. В языках программирования такие вещи наиболее элегантно проделываются с помощью ленивых вычислений. Ленивые вычисления означают такие вычисления, которые производятся только тогда, когда в них действительно возникает необходимость, а до этого времени они откладываются, как могут.

Читать далее

hcrepl.py — скрипт замены заголовочных комментариев

Недавно мне нужно было добавить комментарий с копирайтом в начало каждого файла одной С++-программы. Вручную открывать каждый файл и копировать туда тект было лень, и я написал скрипт, который это делает автоматически. На Python.
Cкачать его вы можете тут: http://y.ne.truisty.org/hcrepl.
Вот как он работает:

$ ./hcrepl.py . --from header.txt --verbose --recursive  --style=M 
Entering include 
Processing include/BinaryReader.h 
Processing include/BinaryWriter.h 
Processing include/Code.h 
Processing include/Huffman.h 
Processing include/Tree.h 
Processing include/TreeNode.h 
. . . 
. . .

В итоге, в начале каждого файла появится комментарий с текстом из файла header.txt. Если в начале файлов уже есть какие-то комментарии, они заменяются новым.
Скрипт распознаёт три стиля комментариев — /* */,  // и ///.

Помощь по программе можено вывести, запустив скрипт с параметром -h.
Может быть, кому-то пригодится.

Получаем вывод дочернего процесса в Unix

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

Замыкания в Java: что может быть

Как определить — нужна та или иная «фишка» в языке программирования или нет? Можно ли то же самое сделать стандартными средствами, или она настолько необходима, что нужно расширить сам язык новыми конструкциями, тем самим и усложнив его, и упростив?

Появление «настоящих» замыканий в Java может спровоцировать волну новых споров о «чистоте» вроде споров об универсальных типах. Однако здесь снова всё неоднозначно, поскольку замыкания — идея очень простая, однако вместе с тем достаточно мощная.

В этой статье я кратко расскажу о замыканиях для Java, которые, возможно, появятся уже в JDK 7. Читать далее