C ++ Как мне перенести эту функцию lisp в компилируемый код?

У меня есть огромная функция lisp, которую я хочу использовать в своем приложении c ++.
Эта функция была сгенерирована с использованием алгоритма принятия дерева решений.

У меня нет хорошей идеи о том, как легко включить его в мой код.
Я не хочу использовать какие-либо внешние библиотеки, и я не хочу делать классы с деревьями и листьями из них. Кроме того, я хочу упростить загрузку, поэтому я сначала подумал о том, чтобы скомпилировать его в большую функцию if-then.

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

Это образец функции LISP. Это около 10.000 строк в полном объеме.

((prev_is_pause is 0)
((prev_prev_gender is d)
((houses_from_month_start < 1.9)
((houses_from_month_start < 0.1)
((customer_numsegs < 3.6)
((customers_from_company_start < 6)
((prev_jobtype is n)
((next_hairtype is -)
((0.0332597 0.109037))
((0.0535314 0.143047)))
((called_houses_from_month_end < 3.5)
((next_next_single is +)
((0.0682613 0.200642))
((month_numhouses < 8.3)
((0.0631857 0.11954))
((0.0737018 0.165414))))
((0.0442889 0.225281))))
((0.075459 0.110669)))
((next_garden is 2)
((0.0726842 0.152881))
((prev_jobtype is n)
((0.0458975 0.12033))
((next_customerbegin_jobtype is s)
((0.0246754 0.0992865))
((prev_prev_talks is aI)
((0.0240179 0.0708011))
((0.0238049 0.0894625)))))))
((prev_birthplace is a)
((next_invoice is ".")
((company_numcustomers < 13)
((called_houses_from_month_end < 2.4)
((next_talks is t)
((0.0586338 0.13392))

0

Решение

У вас есть два варианта:

  • Используйте Lisp в качестве языка сценариев, встроенного в ваше приложение C ++, а затем запустите свою функцию как сценарий. Увидеть этот ответ найти несколько библиотек C ++ для такой задачи.
  • Полностью перевести вашу функцию LISP в C ++. Видимо, вы поместили данные и код в одну и ту же функцию. Вы должны отделить его, поместить данные в файл, который вы загрузите, а затем сделать алгоритм более понятным. Не забудьте разделить алгоритм на несколько отдельных функций … Кроме того, функцию 10000 строк очень сложно поддерживать, поэтому даже если вы не переводите ее на C ++, вы должны разбить ее, как было сказано ранее. Если вы точно знаете, что выполняет функция, это не должно быть слишком сложно. Вы можете использовать некоторые функции C ++ 11 для эмуляции своего рода функционального языка.
1

Другие решения

Еще одним вариантом является использование механизма обратного вызова CFFI:

http://common-lisp.net/project/cffi/manual/html_node/defcallback.html#defcallback

Но это изменит то, как вы смотрите на свое приложение.

0

По вопросам рекламы [email protected]