LINUX.ORG.RU

Haskell FFI

 , ,


0

2

Здравствуйте. Я хочу сделать изменение цвета при работе с консолью без curses, с помощью ESC-последовательностей. просто putStr «\033[031m» не меняет цвет, а как работать с CString я не вкурил, решил сделать FFI вызов. Есть вот такой модуль на С:

#include <stdio.h>

void setClr(int n){
	switch(n){
		case 1: printf("\033[031m"); break;
		case 2: printf("\033[032m"); break;
		case 3: printf("\033[033m"); break;
		case 4: printf("\033[034m"); break;
		case 5: printf("\033[035m"); break;
		case 6: printf("\033[036m"); break;
		case 7: printf("\033[037m"); break;
		case 0: printf("\033[030m"); break;
		default: printf("\033[0m"); break; // reset
	}
}

и вот такой на Хаскеле:

{-# LANGUAGE ForeignFunctionInterface #-}
module Console(setColor,Color(..))where

data Color = Black | Red | Green | Yellow | Blue | Magenta | Cyan | White
	deriving(Enum)

foreign import ccall unsafe "setClr" c_setColor :: Int -> IO()

setColor :: Color -> IO()
setColor c = c_setColor (fromEnum c)

теперь когда я в Main вызываю так:

main = do
	setColor Red
	putStrLn "Hello, World"
сначала выводится «Hello, World», а потом консоль красится в красный. Как это исправить?

★★★★★

Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от adzeitor

Спасибо за ссылку, это интересно, но мне все же хотелось бы знать что неправильно в моем коде, почему setColor выполняется поздно.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от adzeitor

Действительно. Спасибо.

Aswed ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Спасибо за ссылку, это интересно, но мне все же хотелось бы знать что неправильно в моем коде, почему setColor выполняется поздно.

Очевидно, fflush забыли.

netrino
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.