LINUX.ORG.RU

Сообщения pseudo-cat

 

\[C#, F#, Haskell\]Метапрограммирование в статических ЯП

Есть вполне конкретная задача. Нужно типизировать достаточно большой объем данных. Есть описания типов и правила, по которым из этих описаний можно построить типы. Пример описания: (A nil nil (m :type Object :arg «m» :get t :set t)), это просто из головы, что значит - тип A, не имеет базового типа, не реализует интерфейсов, имеет слот m, который при создании типа должен быть взят из входных данных(имеющих заранее известный тип) по ключу «m» и для которого есть стандартные методы get и set.

Дело в том, что объект типа A создается по xml и является его типизированным описанием. К примеру, для инициализации типа A подойдет следующий xml:

<item> <m> I'mm </m> </item>

не очень важно но мало ли - есть описания обобщенных типов, и способ решения коллизий, если по одним входным типам можно построить несколько типов, к примеру если есть тип B =eq= A

Кстати, вся информации для создания типа есть на момент компиляции, но предположите пожалуйста, что все они достаточно однотипны и описание их руками слишком рутинная операция в сравнение с описанием правил создания этих типов из некоторого DSL описания.

К примеру, решение такой задачи на том же Common Lisp, выглядит вполне простым, это ничто иное как:

  • iDSL для описания типов
  • макрос, содержащий логику вывода/создания типа из iDSL

    Интересует, в первую очередь, подход для C# или F#, но интересно посмотреть на любой строго типизированный ЯП

 , ,

pseudo-cat
()

SAX парсер

Кто пользуется этой штукой в Java для рядовых задач, объясните, зачем так сложно? т.е. даже не сложно, а низкоуровнево? неужели никак не абстрагироваться от ручного разбора токенов? да, и вообще, вам не кажется что это коряво - раскидывать логику чтения одного элементы в две функции, для открывающего и закрывающего тега, к примеру?

По поводу уровня абстрагции, ну терпимо, мне кажется, когда можно или обрабатывать уже распарсенные элементы или писать запросы по xml(как к примеру в XmlDocument для .Net), ну уж точно не трогать руками отдельно токен начала, токен конца и подсчитывать вложенность.

ну и чтобы вопрос не казался риторическим, может подскажете более удобную штуку для использования в Java?

 , ,

pseudo-cat
()

обобщение и интерфейсы

Добрый день, есть несколько типов наподобие

type T1() =
    let mutable _a = ""
    member x.a 
        with get() = _a
        and set(v) = _a <- v
    member x.Other1 = ()

type T2() =
    let mutable _a = ""
    member x.a 
        with get() = _a
        and set(v) = _a <- v
    member x.Other2 = ()
Для представления в WPF хочется создать одну модель для них, как лучше это сделать? Представлять и изменять планируется только мемберы, полностью совпадающие у классов.

Меня устроит примерно следующее, если заставить это работать:

type IT =
    abstract member a : string

type T1() =
    let mutable _a = ""
    interface IT with
        member x.a 
            with get() = _a
            and set(v) = _a <- v
    member x.Other1 = ()

type T2() =
    let mutable _a = ""
    interface IT with
        member x.a 
            with get() = _a
            and set(v) = _a <- v
    member x.Other2 = ()

type TModel (t : IT) =
    member x.a 
        with get() = t.a
        and set(v) = t.a <- v

 

pseudo-cat
()

[F#] WPF наследование DataContext

В общем лень перенабирать текст, на stackoverflow задал вопрос, но там похоже не распарсили мой ужасный ангийский или ещё чего, вся надежда на местных гуру. http://stackoverflow.com/questions/9822195/how-inherit-datacontext

pseudo-cat
()

[F#] CodeProvider and CodeDom.Compiler

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

В compile_file CodeCompiler() конструктора банально нет, или я что-то совсем не понимаю.

В compile_file2 ещё лучше - в строке

let res = pro.CompileAssemblyFromFile(opt, path)
вываливается с ошибкой, что нет файла(причём непонятно какого, то ли path, то ли output). path точно есть, с элементарной структурой:
module Test
let sum a b = a + b
output пробовал создавать руками, ничего не меняется.

module TestLoader
open System.IO
open System.CodeDom.Compiler
open Microsoft.FSharp.Compiler.CodeDom
open InternalDSLTypes
open InternalDSL
open Sunbox
open CheckFunctions
open System.CodeDom.Compiler
    
type System.CodeDom.Compiler.ICodeCompiler with 
    member this.CompileAssemblyFromFile 
            (options:CompilerParameters,fileName:string) : CompilerResults = 
        this.CompileAssemblyFromFileBatch(options, [|fileName|])
(*        
let compile_file str assemblies output =
    let pro = new System.CodeDom.Compiler.CodeCompiler()
    let opt = CompilerParameters(assemblies, output)
    let res = pro.CompileAssemblyFromFile(opt, str)
    if res.Errors.Count = 0 then 
         Some(FileInfo(res.PathToAssembly)) 
    else None
*)
  
let compile_file2 path use_asms output =
    use pro = new FSharpCodeProvider()
    let opt = CompilerParameters(use_asms, output)
    let res = pro.CompileAssemblyFromFile(opt, path)
    if res.Errors.Count = 0 
    then Some(FileInfo(res.PathToAssembly))
    else None     

let path = "D:/Sources/ATProjectChecker/ATProjectChecker/tests/test2.fs"
let out = "D:/Sources/ATProjectChecker/ATProjectChecker/tests/test.dll"
let asms = [||]
let res = compile_file2 [|path|] asms out
pseudo-cat
()

[F#] return a method's object

а как вернуть объект из метода, принадлежащему этому объекту

type Check (target, f) = 
    static member (+) (c1, c2) =
        c1,c2    
    member this.id = counter.next
    member this.target : Targets = target
    member this.f (target : obj) : obj -> Result = f
    member this.propagate (target) = 
        let res = f target
        res.check <- this //error
        res 

pseudo-cat
()

[F#] operators overloading

Как заставить этот ненавистный F# переопределить такие операторы как & для отдельных типов, но не глобально.

type t(m) = 
    member this.m : string = m 
    static member (&) (a : t, b : t) = a.m, b.m
> t("t1") & t("t2");;

  t("t1") & t("t2");;
  --------^

C:\Documents and Settings\Kovalev\Local Settings\Temp\stdin(3,9): warning FS1203: In F# code, use 'e1 && e2' instead of 'e1 & e2'

  t("t1") & t("t2");;
  ^^^^^^^

C:\Documents and Settings\Kovalev\Local Settings\Temp\stdin(3,1): error FS0001: This expression was expected to have type
    bool    
but here has type
    t   

pseudo-cat
()

[F#] let -> lvalue = rvalue

как наименее болезненно(без fslex/yacc желательно) сделать так, чтобы можно было писать a = b вместо let a = b. Причём в пределах одного модуля, где гарантированно известно что оператор «=» не будет использоваться ни в каких других случаях.

pseudo-cat
()

[F#] apply

помогите понять почему это не верно? на сколько я знаю, карринг вполне позволяет ф-ции возвращать результаты разных типов, в зависимости от количества переданных аргументов. К примеру ф-ция (A -> B -> C) может возвращать либо (B -> C) либо C

exception MultiArgsError of string 
let rec apply f args = 
    match args with 
    | arg :: [] -> f arg
    | arg :: args ->
        apply (f arg) args        
    | [] -> raise (MultiArgsError("args count incorrect"))

Program.fs(25,16): error FS0001: Type mismatch. Expecting a
    'a -> 'b    
but given a
    'b    
The resulting type would be infinite when unifying ''a' and ''b -> 'a'

pseudo-cat
()

[F#] Runtime compile

Как:

  • загружать в рантайме F# сорцы, при чём чтобы были доступны модули и ссылки, которые доступны из главного приложения, внутри этих фалов.
  • если в этих файлах объявлён один и тот же модуль и в нём есть одинаковые привязки, можно ли их использовать единовременно? Если нет - не беда, можно раскидывать их по другим «местам» инкрементно с загрузкой файлов.
  • после того, как всё загружено, сделать дамп в запускаемый файл(конкретнее - перезаписать себя).
  • перезагрузить эти файлы, после того как они уже загружены. Т.е. возможно переопределить типы, если их объявления есть в загружаемых в рантайме сорцах?

или я слишком много прошу от F#?

Для тех, кто знает лисп, прошу, видимо, аналога compile-file в рантайме.

pseudo-cat
()

coreutils vs realpath

[blocks B      ] app-misc/realpath ("app-misc/realpath" is blocking sys-apps/coreutils-8.15)

Total: 1 package (1 new, 1 binary), Size of downloads: 42 kB
Conflict: 1 block (1 unsatisfied)

 * Error: The above package list contains packages which cannot be
 * installed at the same time on the same system.

  (sys-apps/coreutils-8.15::gentoo, installed) pulled in by
    >=sys-apps/coreutils-6.4 required by (sys-apps/portage-2.2.0_alpha77::gentoo, installed)
    >=sys-apps/coreutils-6.10-r1 required by (app-misc/ca-certificates-20110502-r1::gentoo, installed)
    sys-apps/coreutils required by @system
    sys-apps/coreutils required by (app-admin/eselect-1.2.15::gentoo, installed)
    >=sys-apps/coreutils-6.10-r1 required by (sys-apps/debianutils-3.4.4::gentoo, installed)

  (app-misc/realpath-1.16::gentoo, binary scheduled for merge) pulled in by
    realpath

Как быть? gentoolkit нету, для него, кстати, нужен realpath

pseudo-cat
()

[Пятница] Сочетания

Вот туплю над простеньким алгоритмом, помню что писал его когда СИКП читал, а сейчас не могу сообразить.

Нужны все не повторяющиеся сочетания из n элментов:

A B C D
1* A+B; A+C; A+D; B+C; B+D; C+D
2* A+B+C; A+B+D; A+C+D; B+C+D
3* A+B+C+D 

 

pseudo-cat
()

[BNF] Левая/правая рекурсия

A - нетерминал
a,b - последовательности терминалов и нетерминалов, которые не начинаются с A

Предположим есть леворекурсивная продукция вида A -> Aa, где «+ term» есть «a» :

expr -> expr + term
в книге дракона предлагают устранить эту бесконечную рекурсию изменением продукции до вида A -> Aa | b:
expr -> expr + term | term
Из книги:

Когда A, наконец, заменяется на b, за ним следует последовательность из нуля или большего количества a

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

pseudo-cat
()

Чему вы уделяете больше внимания в программировании?

Последнее время вижу разделение знакомых мне программистов на 2 вида

люди, великолепно владеющие общими алгоритмами, решающие задачи каких-то реальных предметных областей и мало интересующиеся, к примеру, что будет при переполнении int при разных ключах компиляции. знатоки технических вопросов, как правило, платформы. Знают что во что компилируется, какие оптимизации производит компилятор, досконально как работают все фазы компилятора... Так вот интересен вопрос стал в первую очередь потому, что, по-моему, чаще всего вторые слабы в задачах первых, они плохо строят абстракции предм. области и вообще слабо абстрагируются от деталей платформы(типов данных, понятий процедур/ф-ций/выражений и т.д. конкретного ЯП). Во всяком случае на моём личном опыте в конкретной конторе.

Т.к. с голосованием на ЛОРе сложно, прошу поставить циферку в комментарии-

Чему вы уделяете больше внимания?

  • 1/ Техническим тонкостям определённой реализации/платформы ЯП
  • 2/ Реальным прикладным задачам
  • 3/ Одинаково важно и первое и второе
  • 4/ Постигаю с опытом тонкости платформы, решая реальные задачи
pseudo-cat
()

[F#][оптимизация] each with each

Как можно оптимизировать по времени работы:

let c = [1..1000]

let eachWithEachAndCoollect f l =
        let _, result =  l |> List.fold 
                                (fun (acc, result) el ->
                                    let extended =
                                        acc |> List.fold 
                                                (fun acc2 ael -> 
                                                    match f el ael with
                                                    | Some(t) -> t :: acc2
                                                    | None -> acc2) 
                                                [] 
                                    (el :: acc), result @ extended)
                                ([],[])
        result
        
let eachWithEachAndCoollect2 f l =
    let rec iter l acc =
        match l with
        | h :: t ->
             iter t acc @ (t |> List.choose (fun el -> f h el))
        | [] -> acc
    iter l []
                    
c |> eachWithEachAndCoollect (fun a b -> Some(a,b))
(*Real: 00:00:33.223, CPU: 00:00:31.109, GC gen0: 470, gen1: 233, gen2: 28*)

c |> eachWithEachAndCoollect2 (fun a b -> Some(a,b))
(*Real: 00:00:32.130, CPU: 00:00:32.015, GC gen0: 482, gen1: 288, gen2: 20*)

 

pseudo-cat
()

[F#][оптимизация] возможно ли что-то сделать

Можно ли это оптимизировать?

    let rec intersectionCollect f l1 l2 =
        l1 |> List.collect (fun el1 ->
                                l2 |> List.collect (fun el2 ->
                                                        match f el1 el2 with
                                                        | Some(res) -> [res]
                                                        | None -> []))

 

pseudo-cat
()

Книга дракона 2nd

Где скачать, совсем не гуглится

pseudo-cat
()

Wifi. Intel vs Broadcom vs Asus

Вот вопрос к знатокам вифи-сетей.

есть 2 адаптера, вот их инфо:

pscat pscat # iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan1     IEEE 802.11bg  ESSID:"TP-LINK_DAF912"  
          Mode:Managed  Frequency:2.472 GHz  Access Point: Not-Associated   
          Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          
pscat pscat # lspci | grep Wirel
01:0a.0 Network controller: Broadcom Corporation BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller (rev 02)
pscat pscat # iwlist wlan1 scan
wlan1     Scan completed :
          Cell 01 - Address: D8:5D:4C:DA:F9:12
                    Channel:13
                    Frequency:2.472 GHz (Channel 13)
                    Quality=50/70  Signal level=-60 dBm  
                    Encryption key:off
                    ESSID:"TP-LINK_DAF912"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              12 Mb/s; 24 Mb/s; 36 Mb/s
                    Bit Rates:9 Mb/s; 18 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=000000ce23c4f150
                    Extra: Last beacon: 189ms ago
                    IE: Unknown: 000E54502D4C494E4B5F444146393132
                    IE: Unknown: 010882848B960C183048
                    IE: Unknown: 03010D
                    IE: Unknown: 2A0100
                    IE: Unknown: 32041224606C
ps / # lspci | grep Wirel
02:00.0 Network controller: Intel Corporation PRO/Wireless 3945ABG [Golan] Network Connection (rev 02)
ps / # iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

wlan0     IEEE 802.11abg  ESSID:"TP-LINK_DAF912"  
          Mode:Managed  Frequency:2.472 GHz  Access Point: D8:5D:4C:DA:F9:12   
          Bit Rate=12 Mb/s   Tx-Power=15 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=34/70  Signal level=-76 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:19  Invalid misc:652   Missed beacon:0

ps / # iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: D8:5D:4C:DA:F9:12
                    Channel:13
                    Frequency:2.472 GHz (Channel 13)
                    Quality=34/70  Signal level=-76 dBm  
                    Encryption key:off
                    ESSID:"TP-LINK_DAF912"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              12 Mb/s; 24 Mb/s; 36 Mb/s
                    Bit Rates:9 Mb/s; 18 Mb/s; 48 Mb/s; 54 Mb/s
                    Mode:Master
                    Extra:tsf=000000ce2b022a15
                    Extra: Last beacon: 42ms ago
                    IE: Unknown: 000E54502D4C494E4B5F444146393132
                    IE: Unknown: 010882848B960C183048
                    IE: Unknown: 03010D
                    IE: Unknown: 2A0100
                    IE: Unknown: 32041224606C

так вот, почему карточка с лучшим сигналом даёт неустойчивое, еле дышащее соединение, а с более слабым вполне терпимое? Что можно сделать?

pseudo-cat
()

CCL on Android

Играюсь с этой штучкой. Запускаю код, основанный только на лиспе. Также некоторые либы, особенно на чистом лиспе, пашут без проблем. Но очень мало инфы, или я не так ищу, поделитесь, кто знает, информацией.

Интересует -

  • как работает(во что компилирует в итоге)
  • есть ли рабочий способ подключать java-библиотеки
  • так и не понял что дают Android-headers?
  • пакеты arm и arm-android не делают extend, видимо потому что нужно пересобрать ccl - желательно процесс пересборки(просто (rebuild :clean t) не пашет - требует, видимо, сорцы).
  • и вообще побольше инфы

спасибо)

pseudo-cat
()

F# match with when

Почему нельзя написать

let p = true
let pp = false
match p with 
| true when pp 
| false when pp -> 1
 | _ -> 2

pseudo-cat
()

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