Потаенный червизм F#
Aug. 25th, 2010 12:47 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В F# есть набор вуду-функций, типизация которых у меня вызывает неадекватные ощущения. Конкретно, это функции форматированной печати, например sprintf:
sprintf "%s" : string->string //превращает строку в строку
sprintf "%s %d" : string->int->string //превращает строку и число в строку
Итд, соответственно формату.
Выглядит это весьма удобно и типобезопасно, т.е. неправильное сочетание строки формата и параметров не скомпилируется, но как реализована функция sprintf и аналогичные, я с ходу не соображу.
Там используется какое-то адское метапрограммирование на типах + дотнетовский Reflection, причем даже intellisense в студии показывает, что тип возвращаемый sprintf fmt меняется в зависимости в от того, что запишешь в fmt. И строковый литерал fmt явно где-то хитрой магией конвертируется не в строку, а в String.Format<'T>.
sprintf "%s" : string->string //превращает строку в строку
sprintf "%s %d" : string->int->string //превращает строку и число в строку
Итд, соответственно формату.
Выглядит это весьма удобно и типобезопасно, т.е. неправильное сочетание строки формата и параметров не скомпилируется, но как реализована функция sprintf и аналогичные, я с ходу не соображу.
Там используется какое-то адское метапрограммирование на типах + дотнетовский Reflection, причем даже intellisense в студии показывает, что тип возвращаемый sprintf fmt меняется в зависимости в от того, что запишешь в fmt. И строковый литерал fmt явно где-то хитрой магией конвертируется не в строку, а в String.Format<'T>.
no subject
Date: 2010-08-25 12:59 pm (UTC)no subject
Date: 2010-08-25 01:15 pm (UTC)no subject
Date: 2010-08-25 01:03 pm (UTC)жоunsafe-работу с памятью.Я когда-то переписывал его через макрос, но как-то лениво поддерживать было.
no subject
Date: 2010-08-25 01:24 pm (UTC)no subject
Date: 2010-08-25 02:07 pm (UTC)no subject
Date: 2010-08-25 02:09 pm (UTC)Batteries те же самые как делают?
no subject
Date: 2010-08-25 02:11 pm (UTC)no subject
Date: 2010-08-25 02:11 pm (UTC)no subject
Date: 2010-08-25 02:18 pm (UTC)Я не знаю, как такое сделать в camlp4 :-).
no subject
Date: 2010-08-26 09:20 am (UTC)no subject
Date: 2010-08-26 09:21 am (UTC)no subject
Date: 2010-08-25 06:24 pm (UTC)no subject
Date: 2010-08-25 01:25 pm (UTC)нет ли тут ошибки? вроде как два аргумента должно быть
no subject
Date: 2010-08-25 01:50 pm (UTC)no subject
Date: 2010-08-25 01:30 pm (UTC)для меня тож была загадка, но я F# так и не доучил.
как я понимаю, метапрограммирование -- строку для форматирования нужно в compile-time проанализировать и под это дело код подстроить. либо выдать ошибку.
no subject
Date: 2010-08-25 03:14 pm (UTC)Так держать!
no subject
Date: 2010-08-26 05:31 am (UTC)