Помню в одной фидошной конференции (кажется, ru.game.design) кто-то вопрошал: "ну покажите мне хоть один упаковщик файлов на Хаскелле. Мне этот момент хорошо запомнился, потому что незадолго до этого наш северодонецкий форумчанин завоевал первое место в конкурсе, организованном в конференции ru.compression: на лучший упаковщик файлов. И написал он его как раз на языке Haskell.
Вот такие бывают конфузы.
Особенно любят спорить насчет незаменимости своего инструмента.
"Мы решаем низкоуровневые задачи, поэтому нам не подойдут высокоуровневые языки".
Причем под низкоуровневостью понимается, к примеру, работа с объектами находящимеся в памяти видеокарты. В качестве такового объекта раньше очень любили обсуждать VBO (vertex buffer object). Ну вот находятся они в видеопамяти. А раз так, то С/C++ незаменим для работы с ними!
А вот и нет! И чтобы доказать это я приведу самопальную программу на haskell'е, которая создает и затем использует VBO. Проще некуда:
import Graphics.UI.GLUT
import Graphics.Rendering.OpenGL.GL.VertexArrays
import Graphics.Rendering.OpenGL.GL.BufferObjects
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Storable
import Foreign.Ptr
my_vertex :: [Vertex2 GLfloat]
my_vertex = [Vertex2 0 0
,Vertex2 0.5 0.5
,Vertex2 (-0.5) (-0.5)
,Vertex2 (-0.5) 0.5
,Vertex2 0.5 (-0.5)
]
createVertexBuffer vertex = do
withArray vertex do_init
return (VertexArrayDescriptor 2 Float 0 nullPtr)
where
do_init ptr = bufferData ArrayBuffer $= (size, ptr, StreamDraw)
size = fromIntegral $ length vertex * (sizeOf (head vertex))
redraw = do
clear [ColorBuffer]
pointSize $= 4
drawArrays Points 0 5
flush
main = do
initialize "GLTest" []
w <- createWindow "GlTest Window"
[nm] <- genObjectNames 1
bindBuffer ArrayBuffer $= Just nm
v <- createVertexBuffer my_vertex
arrayPointer VertexArray $= v
clientState VertexArray $= Enabled
displayCallback $= redraw
mainLoop
deleteObjectNames [nm]
(c) haskell
Оставить комментарий