Рефераты. Адресная книжка на Haskell

Разработчики используют WxWidgets по разным причинам: от замены MFC на одной платформе до обеспечения возможности быстрого переноса приложения с, к примеру, Windows на Unix и Mac OS X. WxWidgets также позволяет переносить приложения на мобильные платформы, такие как встраиваемый Linux, Pocket PC, или Palm OS.

Проект WxWidgets был основан в 1992 году, когда Джулиан Смарт работал в Эдинбургском Университете над инструментом диаграммирования под названием “Hardy”. Он не пожелал выбирать между разработкой его для рабочей станции Sun или для платформы PC, он предпочел написать кросс-платформенный фреймворк.

Поскольку мощность существующих кросс-платформенных фреймворков была ограничена, а отделение не имело необходимого бюджета для написания такового в любом случае, то он решил написать такой самостоятельно. Университет предоставил ему доступ для закачки wxWidgets 1.0 на FTP-сервер отделения в сентябре 1992 и другие разработчики начали использовать его код. В начале wxWidgets был нацелен на Xview и MFC 1.0. Пользователи Borland С++ , жаловавшиеся на привязку к MFC, таким образом стали переписывать программы на чистый Win32. Поскольку XView открывал путь на Motif, то перенос на Motif был запущен весьма оперативно. Тем временем маленькое, однако полное энтузиазма сообщество wxWidgets-программистов уже появилось и обзавелось своей почтовой рассылкой. Добавления и исправления получали распространение в рассылке. WxWidgets постепенно расширял круг своей пользовательской аудитории по всему миру: индивидуальные программисты, академические группы, государственные учреждения, и те кто нашел, что WxWidgets - более удобный продукт с лучшей поддержкой, чем коммерческие продукты, которые они до этого видели или использовали.

В 1997 году новая версия wxWidgets 2 API была спроектирована при помощи Маркуса Холзема(который еще во времена создания рассылки создал Xt направление wxWidgets) . Вольфрам Глогер предложил идею портирования WxWidgets на GTK+ и Роберт Роблинг создал необходимые графические элементы пользователя, адаптированные для GNOME. Он стал основоположником разработки wxGTK, и поныне оставаясь главным специалистом в разработке Unix/Linux-порта WxWidgets. В 1998 году порт для Windows и порт для GTK+ были совмещены и выложены под управлением CVS системы. Вадим Зейтлин присоединился к проекту чтобы поспособоствовать огромной части дизайна и кода, а также Стефан Ксомор начал создание MAC OS порта, тоже в 1998. 1999 обозначен приходом программиста с именем Vaclav Slavik. Он создал внушительные wxHTML классы и HTML-базированный просмотрщик помощи.

В 2000 году фирма SciTech Inc. профинансировала начало разработки wxUniversal.

Собственный для wxWidgets набор графических элементов пользователя для использования на платформах, у которых пока что нет никаких графических элементов пользователя. wxUniversal стал первым используемым в этой фирме портом для MGL, их низкоуровневому графическому слою.

В 2002 году Джулиан Смарт и Роберт Ройблинг добавил wxX11 порт используя wxUniversal графические элементы пользовательского интерфейса.

В июле 2003 года wxWidgets начал запускаться на Windows CE, а Роберт Ройблинг продемонстрировал wxGTK приложение, запущенное на встраиваемой платформе GPE Linux.

В 2004 году WxWidgets по просьбе Microsoft поменял оригинальное название “wxWindows” на WxWidgets, за что получил финансовую помощь.

Также в 2004 Стефан Ксомор и другие его помощники успешно завершили перенос WxWidgets (wxMac) на MAC OS X., значительно улучшив функциональные возможности приложений для OS X. Порт, используяющий Cocoa был заметно улучшен (направление возглавляли Дэвид Еллиот и Виллиам Осборн).

Виллиам Осборн выиграл конкурс по созданию версии wxWidgets для Palm OS 6, задачей ставилась минимальная поддержка платформы.

В апреле 2005 года была выпущена версия 2.6, в которой было осуществлено слияние всех основных портов фреймворка.

20 февраля 2004 г. разработчики wxWindows предупредили, что проект будет переименован в wxWidgets, как результат переговоров Майкрософт и Юлиана Смарта в связи с зарезервированной Майкрософт торговой маркой Windows (за смену имени разработчики wxWidgets и других связанных проектов получили денежную компенсацию).

Проекты поддержки языков программирования:

wxBasic -- для Бэйсик

wxPerl -- для Perl

wxPython -- для Python

wxRuby -- для Руби

Anvil -- для Руби, на базе wxRuby, с улучшеным синтаксисом

wxSqueak -- для Smalltalk

wxLua -- для Lua

wx4j -- для Java

wxJS -- для JavaScript

wxHaskell -- для Haskell

wxEiffel -- для Эйфель

wxD -- для D

wx.NET -- для .NET

wxErlang -- для Erlang

2.4.2 wxHaskell

wxHaskell является портативной GUI библиотекой для Haskell, построенной на wxWidgets. Очень часто используются для создания графического интерфейса на функциональном языке.

wxHaskell является графической библиотекой среднего уровня. От wxHaskell есть производные библиотеки высокого уровня:

wxFruit

Phooey

В отличие от wxHaskell, на высоком уровне GUI эти библиотеки реализованы на Gtk2Hs, которая основана на gtk2.

Все вышеупомянутые GUI библиотеки являются экспериментальными, с использованием современных математических понятий в их подходе.

3. Анализ задачи

icqTest :: String -> Bool

По наличию @ в строке устанавливает ее принадлежность к полю e-mail.

pare :: [String] -> [(String,String)]

Из входной строки формирует список пар ICQ и e-mail.

pare2 :: [String] -> [(String,String)]

Из входной строки формирует список пар e-mail и ИОФ

comp :: String -> [(String,String)] -> String

Функция алгоритма поиска для получения ИОФ контакта

f :: [(String,String)] -> [(String,String)] -> String

Функция алгоритма поиска, формирует структуру таблицы html документа.

outFile :: String -> String -> String -> IO()

Функция, выводящая результаты поиска в файл и формирующая html документ

main :: IO ()

Входная точка в программу, формирует графический интерфейс пользователя.

4. Программная реализация

import Graphics.UI.WX

import Graphics.UI.WXCore

import System

import Char ( toUpper)

import IO

--test for e-mail? or ICQ?

icqTest :: String -> Bool

icqTest [] = False

icqTest (x:xs) = if x=='@' then True else icqTest xs

--pare ICQ and E-mail

pare :: [String] -> [(String,String)]

pare [] = []

pare [x] = (x," "):[]

pare (x:xs) = if icqTest (head xs)==False then (x,head xs):[]++pare (tail xs) else (x," "):[]++pare xs

--pare E-mail and IOF

pare2 :: [String] -> [(String,String)]

pare2 [] = []

pare2 (x:xs) = if icqTest (head xs)==False then (if icqTest (head(tail xs))==False then (x++" "++(head xs)++" "++(head (tail xs)),head(tail(tail xs))):[]++pare2 (tail(tail(tail xs))) else (x++" "++head xs,head(tail xs)):[]++pare2 (tail(tail xs)) ) else (x,head xs):[]++pare2 (tail xs)

--compare E-mail and return IOF

comp :: String -> [(String,String)] -> String

comp _ [("","")] = []

comp [] _ = []

comp x (y:ys) = if x==snd y then fst y else comp x ys

--compare pares and build html table

f :: [(String,String)] -> [(String,String)] -> String

f [([],[])] _ = ""

f (x:xs) (y:ys) = (("<TR>"++"\n"++"<TD>"++comp (fst x) (y:ys)) ++"</TD>"++"\n"++"<TD>"++ snd x ++ "</TD>" ++"\n"++"<TD>"++"<a href="++"\""++"mailto:"++ fst x ++"\""++">"++fst x++"</a>"++"</TD>"++"\n"++"</TR>"++"\n") ++ (if null xs then "" else f xs (y:ys))

--write html code in out File

outFile :: String -> String -> String -> IO()

outFile x y z = do s <- readFile x; d <- readFile y;writeFile z "<HTML> \n <Body bgcolor = floralwhite> \n <TABLE border=5 alight = center> \n <TR> <TH> FIO </TH> \n <TH> ICQ </TH> \n <TH> E-mail </TH> \n </TR> \n"; appendFile z (f (pare(words s))(pare2(words d)));appendFile z "</TABLE> \n </BODY> \n </HTML>"

--GUI mode

main :: IO ()

main = start gui

gui :: IO ()

gui

= do -- main gui elements: frame, panel, text control, and the notebook

f <- frame [text := "Controls"]

p <- panel f []

nb <- notebook p []

textlog <- textCtrl p [enabled := False, wrap := WrapNone]

-- use text control as logger

textCtrlMakeLogActiveTarget textlog

logMessage "logging enabled"

-- set f [on closing :~ \prev -> do logSetActiveTarget oldlog; logDelete log; prev]

-- first page

p1 <- panel nb []

--textBoxes

txt1 <- textEntry p1 [alignment := AlignLeft, text := "icq file name"]

txt2 <- textEntry p1 [alignment := AlignLeft, text := "e-mail file name"]

txt3 <- textEntry p1 [alignment := AlignLeft, text := "out file name"]

--buttons

ok <- button p1 [text := ">>", on command := do f1 <- get txt1 text;f2 <- get txt2 text;f3 <- get txt3 text; logMessage f1 ;logMessage f2;logMessage f3;outFile f1 f2 f3;]

quit <- button p1 [text := "Close", on command := close f]

-- specify layout

set f [layout :=

container p $

column 0

[ tabs nb

[tab "Sort Contakt List" $

container p1 $ margin 10 $ column 5 [hstretch $ widget txt1,hstretch $ widget txt2,hstretch $ widget txt3,row 5 [floatRight $ widget ok,floatLeft $ widget quit]]

]

, hfill $ minsize (sz 20 80) $ widget textlog

]

, clientSize := sz 400 300 ]

return ()

5. Тестирование программы

Изначальный вид приложения при запуске:

Рис.5.1

Введем Пути файлов в поля ввода:

Рис.5.2

После счелкаем кнопку >> и получаем html документ:

Заключение

В результате проделанной работы было получено приложение, сортирующее список контактов из файлов по ключевому полю e-mail. Для решения поставленной задачи был разработан и реализован алгоритм поиска для файлов с информацией, хранимой в заданном формате. Для реализации приложения была использована среда разработки языка Haskell-98 GHCi 6.10.1.

Список используемой литературы

1. Н.А. Роганова «Функциональное программирование»

2. Курс лекций по функциональному программированию

3. www.intuit.ru/department/pl/haskel98/6/

4. www.rsdn.ru/article/haskell/haskell_part1.xml

5. http://wxhaskell.sourceforge.net/

6. http://en.wikipedia.org/wiki/WxWidgets

Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.