local fun Drag | button@{| onDrag=handler:'fun' |}, x,y -> handler(button,x,y) | _,_,_ -> --NOOP end Вы называете вот это синтаксическим сахаром? По-моему это синтаксический шум.
Что означает: есть некий объект (lua-table или userdata), в котором точно есть поле (для которого мы вводим переменную 'handler') с именем "onDrag" и типом "function".
Да, я считаю, что это сахар по сравнению с тем, чтобы каждый раз писать довольно неочевидное
if (type(button)=='table' or (getmetatable(button) and getmetatable(button).__index)) and button.onDrag~=nil and type(button.onDrag)=='function' then ...
button@ - это Scala/Haskell, мне нравится больше, чем окамловое 'as button'. '_,_,_ -> ' - это чтобы не вводить весь институт 'partial functions' как в Scala - (что не исключено, просто не очень было надо) и в некотором роде отражает тот факт, что туплы в луа не первоклассная сущность.
Да это все понятно, просто сравнение с образцом в данном случае перестает выполнять свои изначальные функции и становится банальным duck typing. А утиная фигня это всегда фигня. onDrag может не отвечать требованиям, которые мы подразумеваем. Теряется строгость, причем с совершенно неочевидными для логики последствиями. И первый же onDrag с какими-нить дополнительными устрашениями из другой библиотеки доведет отлаживающего до ручки. Впрочем, в динамических языках за строгостью обычно не следят. По понятным причинам.
Comments 9
По моему это чисто библиотечная проблема, в PIL написано даже как операторы для множеств переопределить.
не совсем. я еще хочу синтаксис для множеств специальный.
а на haxe я посмотрю обязательно, спасибо.
Reply
-- Set is a `Set{...}
-- 'in' - reserved word :(
local fun contains
| set@`Set{...}, val -> set:contains(val)
| _,_ -> false -- ???
end
-- using our pseudo operator:
if someset `contains` val then
...
end
Итерацию, конечно, нужно делать не через pairs, а как-то:
for x in someset:iter() do
...
end
Reply
Речь про LPEG? Не подскажете, как его в винде приготовить (без cygwin'a, если возможно)?
Reply
http://code.google.com/p/luaforwindows/
... но там 18 мегабайт всякого барахла.
Если вам для того теста парсинга OSM то вот :)
http://dl.dropbox.com/u/5738262/lua-lpeg-test.zip
... просто распаковать в любую директорию и запустить:
> lua.exe parse-osm.lua
Reply
У меня получилось 20.2 MB/s - на несколько процентов быстрее Boost.Spirit'a.
Reply
Reply
local fun Drag
| button@{| onDrag=handler:'fun' |}, x,y -> handler(button,x,y)
| _,_,_ -> --NOOP
end
Вы называете вот это синтаксическим сахаром? По-моему это синтаксический шум.
Reply
Сахаром тут является конретно
{| onDrag = handler:'fun'|}
Что означает: есть некий объект (lua-table или userdata), в котором точно есть поле (для которого мы вводим переменную 'handler') с именем "onDrag" и типом "function".
Да, я считаю, что это сахар по сравнению с тем, чтобы каждый раз писать довольно неочевидное
if (type(button)=='table' or (getmetatable(button) and
getmetatable(button).__index)) and button.onDrag~=nil and
type(button.onDrag)=='function'
then
...
button@ - это Scala/Haskell, мне нравится больше, чем окамловое 'as button'.
'_,_,_ -> ' - это чтобы не вводить весь институт 'partial functions' как в Scala - (что не исключено, просто не очень было надо) и в некотором роде отражает тот факт, что туплы в луа не первоклассная сущность.
Reply
Впрочем, в динамических языках за строгостью обычно не следят. По понятным причинам.
Reply
Leave a comment