Тип с конечным числом элементов - OCaml
Я использую CIL для обработки программ на C, используя библиотеку pthread. Я должен обрабатывать пользовательские и не pthread-функции иначе, чем pthread-функции. Могу ли я иметь определение типа, которое выглядит примерно так:
type PThreadFun = "pthread_create" | "pthread_join" | ...;;
так что я сначала сопоставляю шаблон с именем функции, а затем отправляю
processFunction (fn_name: string)
или же
processPThreadFun (fn_name: PThreadFun)
1 ответ
Вы можете иметь типы сумм в OCaml, они называются вариантами. Но их значения не являются строками. Вы могли бы объявить
type pthreadfun_t = Pthread_create | Pthread_join (* etc *);
Затем вам понадобится код, обрабатывающий представление CIL, чтобы найти такой pthreadfun_t
ценности.
Кстати, вас может заинтересовать MELT, который является предметно-ориентированным языком для расширения компилятора GCC. MELT работает с внутренними представлениями GCC, особенно с Gimple. Это не Ocaml или CIL, но это плагин GCC, предоставляющий вам мощный язык, похожий на Lisp-домен, с мощным сопоставлением с образцом, включая возможность сопоставления Gimple-s, Tree-s, строк и т. Д.