LINUX.ORG.RU

Сообщения ryukzak

 

Vim and dvorak

У кого-нибудь есть опыт использования?

ryukzak
()

[Haskell] Методы решение проблемы двусмысленных переменных типа

Доброго времени суток.

В большинстве случаев, данная проблема решалась без каких-либо неприятностей по средством подписывания типа, но при работе с mongoDB это приходится делать очень часто для одного из операторов:

(=:) :: Val v => Label -> v -> Field
foo = "aoeu" =: "aeou"
foo' = "aoeu" =: ("aeou" :: String)
при перегруженных строковых литералах.

Другой способ (сейчас практикую), создание функции с более жёстким типов (в данном случае с типом, а именно:

(=::) :: Label -> String -> Field
(=::) = (=:)
что не кажется очень хорошей идеей. Есть другие пути?

 

ryukzak
()

Gnome 3, как отключить шорткат, которого нет в настройках.

Доброго времени суток.

Когда подключены два монитора, появляется шорткат Win+p, который переключает режимы мониторов, что невероятно сбивает, так как это один из ходовых шортувтоы в емаксе с эргономической раскладкой.

Собственно вопрос, где можно найти, как его вырубить нафиг. Смотрел все стандартные менюшки + gconf-editor (мог и пропустить, в принципе).

Дистрибутив - linuxmint 12 и gnome 3.

ryukzak
()

[Haskell] Почему такая разница в производительности?

Доброго времени суток.

Задача простая, есть массив чисел. Необходимо посчитать сколько значений в попало в заданные интервалы. Два решения (оба скучные и слишком ручные):

let r1 = 580
let r2 = 1000
let r3 = 1500
let r4 = 5500
-- (1)
print $ length $ filter (\x -> x < r1) result
print $ length $ filter (\x -> r1 < x && x < r2) result
print $ length $ filter (\x -> r2 < x && x < r3) result
print $ length $ filter (\x -> r3 < x && x < r4) result
print $ length $ filter (\x -> r4 < x) result
-- (2)
print $ show $ foldl (\(a,b,c,d,e) x 
                      -> case x of
                          x | x < r1 -> (a+1,b,c,d,e)
                          x | x < r2 -> (a,b+1,c,d,e)
                          x | x < r3 -> (a,b,c+1,d,e)
                          x | x < r4 -> (a,b,c,d+1,e)
                          otherwise  -> (a,b,c,d,e+1)
                     ) (0, 0, 0, 0, 0) result
Первый вариант, как и ожидается, считается примерно мгновение (хотя второй вариант кажется более оптимальным, так как исходный список проходится 1 раз, а не 10). Второй же сперва пыхтит, а потом падает в переполнение стека.

В генерируемый код не смотрел.

 

ryukzak
()

[Haskell] Template, как сгенерировать определение?

Доброго времени суток.

Нужно сгенерировать класс вида:

data Port_name = Port_name
class WithPort_name where
  name :: d -> PortInstance d Port_name
  name = \d -> PortInstance d Port_name
Причём name всякий раз необходимо заменить конкретное имя порта. Сейчас есть решение, где нужное AST собирается руками
DataD [] typeName [] [NormalC typeName []] []...
, но это какая-то порнография.

В случае если использовать нотацию [d| |], то он не хочет подставлять из окружения значения переменных, или я не знаю, как его об этом правильно попросить.

 

ryukzak
()

Haskell обощённая работа с запясями

В запись хранит списки. Необходимо в эти списки добавлять новые элементы. Типы списков разные. Сейчас это делается так (для каждого поля своя функция add)z

data T = T {a :: [T1], b :: [T2]}
add state v = let T {a = vs} = state in
              state {a = v:vs}
Очень хочется обощить функцию add так, что бы имя поля можно было передавать внутрь функции, вызывая ей примерно так: add a state v.

Возможно ли это выразить (интуитивно, это может быть как-то выражено с использованием экзистенциальных типов, но как)?

ryukzak
()

Haskell Word8 -> Int

Как можно преобразовать таким образом тип? У меня получилось вот так:

\x -> fromInteger $ toInteger x

Но уж как-то слишком страшно.

ryukzak
()

Haskell или Ocaml для компилятора

Доброго времени суток. В качестве предстоящей бакалаврской хочу попробовать себя на ниве компилятора строения. Писать планируется либо на Haskell (есть какой-то опыт) или на Ocaml (совсем не знаком). Какой из языков этих языков лучше подходит с трудом представляю.

Плюс в сторону Ocaml - наличие Zoo как хорошего примера.

Компилировать планируется в байт код какой-нибудь ВМ. Есть необходимость реального времени, какие для этого лучше посмотреть?

ryukzak
()

Haskell, записи

Когда создаётся новый тип данных, к примеру:

data Type1 = Type1 { first :: int, second :: int}

data Type2 = Type2 { first :: int, second :: int}

Происходит перекрытие имён first и second. Если способ это избежать? Есть ли возможность в принципе избежать создание функций доступа, дабы доставать значения исключительно через pattern matching.

ryukzak
()

[emacs] Не поставить keybinding в консоли.

Есть желание повесить на \C-tab. В графике работает без проблем, а в консоли не отлавливает нажатие. Причём если назначать интерактивно через global-set-key - не работает. Через local-set-key - работает.

(local-set-key (read-kbd-macro "<C-tab>") 'fold-dwim-toggle)
(local-set-key [(control tab)] 'fold-dwim-toggle)
(local-set-key (kbd "C-TAB") 'fold-dwim-toggle)
(local-set-key (kbd "C-<tab>") 'fold-dwim-toggle)
(local-set-key "\C-TAB" 'fold-dwim-toggle)
(local-set-key "\C-tab" 'fold-dwim-toggle)

Вот такие варианты пробовал, успеха не принесли. Есть другие способы?

GNU Emacs 22.1.1 (mac-apple-darwin)

 

ryukzak
()

[Lisp] Макросы и возврат «пустого места»

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

(defmacro foo (&key (var 0 var-p))
  `(,(if var-p var 'clear-space)))

(foo :var 1)

Собственно совсем не понимаю как сделать в приведёном выше примери clear-space истинно пустым местом, кроме как раскидать всё на 2 ветки в самом начале, так как это было бы сильно не желатильно в виду сильного разрастания кода. Может есть какой-то символ разделитель, или метод?

 

ryukzak
()

Lisp, loop

(loop for a in '(a b c d)
   and b in '("1" "2" "3" "4") 
   with cons = (concatenate 'string
			    (symbol-name a)
			    b)
   do (format t "~a ~a ~a~%" a b cons)
   collect cons)

Печатает на экран

A 1 NIL
B 2 NIL
C 3 NIL
D 4 NIL

Возвращает список из «NIL». А хотелось бы список («a1» «b2» «c3» «d4»)

ryukzak
()

Lisp make-instanse и initialize-instance

Необходимо создать объект класс примерно такой.

(defclass c1 () ((subclass)))

subclass - объект другого класса, которому для инициализации надо указать поле, допустим key. Есть ли возможность указать в make-instance значение, которое не будет записано в слот или какой-нибудь другой путь передать данные без дублирования их с1.

ryukzak
()

ltk. Дочерние окна.

Доброго времени суток.

Необходимо - создать окно по нажатию кнопки, пеключить в него фокус и создать свои независимые элементы. В идеале запретить переключения фокуса на родительское окно.

(defun main()
  (ltk:with-ltk ()
    (let* ((btn1 (make-instance 'ltk:button
				:text "new"
				:command (lambda () (sub-win))))
	   (btn2 (make-instance 'ltk:button
				:text "exit"
				:command (lambda () (setf ltk:*exit-mainloop* T)))))
      (ltk:pack btn1)
      (ltk:pack btn2))))

(defun sub-win ()
  (ltk:with-ltk ()
    (let* ((btn1 (make-instance 'ltk:button
				:text "exit"
				:command (lambda () (setf ltk:*exit-mainloop* T)))))
      (ltk:pack btn1))))

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

(defun main()
  (ltk:with-ltk ()
    (let* ((btn1 (make-instance 'ltk:button
				:text "new"
				:command (lambda () (sub-win))))
	   (btn2 (make-instance 'ltk:button
				:text "exit"
				:command (lambda () (setf ltk:*exit-mainloop* T)))))
      (ltk:pack btn1)
      (ltk:pack btn2))))
(defun sub-win ()
  (make-instance 'ltk:toplevel)
    (let* ((btn1 (make-instance 'ltk:button
				:text "exit"
				:command (lambda () (setf ltk:*exit-mainloop* T)))))
      (ltk:pack btn1)))
В таком варианте все виджеты создаются не на новом окне, а родительском. Перепись *tk* результата не даёт. Также возникает проблема с закрытием дочернего окна, так как не совсем понятно как.

В мане с оф сайта найти ответы не удалось.

ryukzak
()

Lisp. Написание макроса и комбинация &option &key &rest

Есть желание написать макрос, что бы не приходилось часто писать конструкции вида (let ((head (car list)) (tail (cdr list))) код). Но возникли следующие проблемы:

(defmacro xxs (lst head tail &rest body)
`(let ((,head (car ,lst))
(,tail (cdr ,lst)))
,body))

(xxs '(1 2 3) 'x 'xs
'(+ x (car xs)))

Выдаётся следующая ошибка:
LET: illegal variable specification #1=('X (CAR '(1 2 3)))
Суть ошибки вроде бы ясна, а вот способ решения не придумать.

Так же не знаю как можно расположить дерективы &option &key &rest, что бы в функции можно было бы указывать по желанию имена head и tail.

ryukzak
()

Haskell, не могу понять в чём ошибка

import Data.Bits

args value list = foldr f 0 $ zip (reverse list) [0..]
where
f x (a,b)
| testBit value a = setBit x 1
| otherwise = clearBit x 1

main = print $ args 12 [1,2,3]

По замыслу функция дожна вынимать из value биты с указынными номерами, и формировать из них новое число. В лист порядок битов обратный.

Вывод ошибки

No instance for (Bits (Int, t))
arising from a use of `args' at main.hs:15:15-29
Possible fix: add an instance declaration for (Bits (Int, t))
In the second argument of `($)', namely `args 12 [1, 2, 3]'
In the expression: print $ args 12 [1, 2, 3]
In the definition of `main': main = print $ args 12 [1, 2, 3]

ryukzak
()

Regexp и строки со вложенными скобками

Возникла проблема, надо из строки вынуть участки которые в скобках. Причём скобки могут быть вложенными (к примеру "( ())") на любую глубину. Есть ли способ это сделать только по средствам регулярных выражений? Выражения в стиле перл

ryukzak
()

ghc ошибка при компиляции

код следующийй

import qualified Data.ByteString as B main = print "hello"

Импорт из документации ошибка

test.o(.text+0x217): In function `__stginit_Main_': : undefined reference to `__stginit_bytestringzm0zi9zi0zi1zi1_DataziByteString_'

Код пробовал компить на ghc 6.83 6.82 6.10 Вывод ошибки от первой. Где искать ошибку?

ryukzak
()

Замыкание и haskell.

По идее, для замыкания необходима некоторая переменная, с локальной областью видимости. Но насколько можно судить, переменных в хаскел нету как факт, а лишь функции. Отсюда вопрос, возможны ли замыкания в принципе, и если да, то можно какой-нибудь примерчик...

Или какой-нибудь альтернативный метод, что-бы создать какой-либо общий сторедж данных (к примеру список), для накопление в нём данных от 2-х разных потоков?

ryukzak
()

emacs странное поведение с ispell и .emacs

Доброго времени суток.
В .emacs есть след строки:

(setq
ispell-extra-args (quote ("" "-a"))
ispell-have-new-look t
ispell-local-dictionary "russian"
ispell-local-dictionary-alist (quote (("russian" "[АБВГДЕЖЗИЙКЛМНОПРСТУФХЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцшщюя]" "[^АБВГДЕЖЗИЙКЛМНОПРСТУФХЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцшщюя]" "" nil ("-d" "ru-yo") nil koi8-r)))
ispell-message-dictionary-alist (quote (("" . "")))
ispell-program-name "aspell")

После их ручного исполнения (\C-x \C-e) проверка орфографии работает на ура везде. После загрузки не работает. Есть идеи?

ryukzak
()

RSS подписка на новые темы