29 сент. 2007 г.
24 сент. 2007 г.
15 сент. 2007 г.
Использование декораторов в Lua
Дэвид Манура (David Manura) предложил интересную технику использования декораторов в Lua. (По крайней мере, его письмо — первое, в котором я её увидел.)
Рассмотрим простейший пример того, что можно сделать при помощи декораторов:
Вывод:
Реализация:
Главное достоинство такого метода — в «удобоваримом» синтаксисе без необходимости привлечения метамеханизмов.
Правда, используемый подход не позволяет пользоваться синтаксическим сахаром для объявления функций и методов, но это небольшая беда. Вот к такой записи не прикрутишь декоратор:
Один из вариантов применения такого декоратора — проверка входных и выходных параметров функции (и, шире, пред- и постусловий вообще).
Например (первое, что пришло в голову):
Но об этом — в следующий раз.
Рассмотрим простейший пример того, что можно сделать при помощи декораторов:
local foo =
print_start_end(printor 'begin foo', printor 'end foo')
..
function (buzz)
print ('FOO called with ' .. buzz)
end
foo('ARGUMENT')
Вывод:
begin foo
FOO called with ARGUMENT
end foo
Реализация:
function printor(msg)
return function() print(msg) end
end
function print_start_end(prologue, epilogue)
assert(type(prologue) == 'function'
and type(epilogue) == 'function')
local M = {}
setmetatable(M, {
__concat = function(lhs, rhs)
assert(type(rhs) == 'function')
return function(...)
prologue()
local result = rhs(...)
epilogue()
return result
end
end;
})
return M
end
Главное достоинство такого метода — в «удобоваримом» синтаксисе без необходимости привлечения метамеханизмов.
Правда, используемый подход не позволяет пользоваться синтаксическим сахаром для объявления функций и методов, но это небольшая беда. Вот к такой записи не прикрутишь декоратор:
function bar(buzz)
print('BAR called with ' .. buzz)
end
foobar = {}
function foobar:buzz(foo)
print('foobar:buzz called with ' .. foo)
end
Один из вариантов применения такого декоратора — проверка входных и выходных параметров функции (и, шире, пред- и постусловий вообще).
Например (первое, что пришло в голову):
local string.rep =
docs
[[Returns a string that is the concatenation
of n copies of the string s.]] ..
args { 'string', optional 'number' } ..
rets { 'string' } ..
function (s, n)
n = n or 1
if n > 1 then
local t = {}
for i = 1, n do
t[i] = s
end
s = table.concat(t)
end
return s
end
Но об этом — в следующий раз.
11 сент. 2007 г.
Closing over context still not easy in mainstream languages?
"Lisp 1.5, complete with support for lexical closures, appeared in 1959. It’s 2007. That’s forty-eight years."
http://www.lshift.net/blog/2007/09/11/closing-over-context-still-not-easy-in-mainstream-languages-film-at-11
Use Lua, man, use Lua!..
7 сент. 2007 г.
It Was a Very Good Year
When I was seventeen
It was a very good year
It was a very good year for small town girls
And soft summer nights
Wed hide from the lights
On the village green
When I was seventeen
When I was twenty-one
It was a very good year
It was a very good year for city girls
Who lived up the stair
With all that perfumed hair
And it came undone
When I was twenty-one
When I was thirty-five
It was a very good year
It was a very good year for blue-blooded girls
Of independent means
Wed ride in limousines
Their chauffeurs would drive
When I was thirty-five
But now the days grow short
Im in the autumn of the year
And now I think of my life as vintage wine
>from fine old kegs
>from the brim to the dregs
And it poured sweet and clear
It was a very good year
It was a mess of good years
Одиннадцатого февраля 2006
Подписаться на:
Сообщения (Atom)
