Мое решение хорошо работает в небольших списках и вполне читаемо без зависимостей.
def merge_list(starting_list):
final_list = []
for i,v in enumerate(starting_list[:-1]):
if set(v)&set(starting_list[i+1]):
starting_list[i+1].extend(list(set(v) - set(starting_list[i+1])))
else:
final_list.append(v)
final_list.append(starting_list[-1])
return final_list
Бенчмаркинг:
lists = [[1,2,3], [ 3,5,6], [8,9,10], [11,12,13]]
% timeit merge_list (lists)
100000 циклов, лучше всего 3: 4,9 мкс на петлю
Как отметил @ Цыварев, CMake не поддерживает имена динамических функций. Итак, вот несколько альтернатив:
Простой подход
macro(my_macro ver)
if(${ver} EQUAL 1)
my_macro1()
elseif(${ver} EQUAL 2)
my_macro2()
else()
message(FATAL_ERROR "Unsupported macro")
endif()
endmacro()
set(ver 1)
my_macro(ver)
set(ver 2)
my_macro(ver)
A call()
Выполнение функции
Построение на Работа @Fraser вот более общая реализация функции call()
:
function(call _id)
if (NOT COMMAND ${_id})
message(FATAL_ERROR "Unsupported function/macro \"${_id}\"")
else()
set(_helper "${CMAKE_BINARY_DIR}/helpers/macro_helper_${_id}.cmake")
if (NOT EXISTS "${_helper}")
file(WRITE "${_helper}" "${_id}(\$\{ARGN\})\n")
endif()
include("${_helper}")
endif()
endfunction()
set(ver 1)
call(my_macro${ver})
set(ver 2)
call(my_macro${ver})