Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет peter_lemenkov ([info]peter_lemenkov) в [info]programming
@ 2006-10-19 22:23:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Цикл на Erlang'е
Приветствую!

Что-то я недопонял. Как заставить выполнить кусок кода, скажем, шесть раз.

Дано:

unixODBC, откуда я читаю записи вот так:

main_cycle (Ref) ->
	case odbc:select_count(Ref, "select A,B,C from name.table") of 
		{ok, NumberOfRows} ->
			if 
				NumberOfRows > 0 ->
					select_calls(Ref)
			end;
		Error -> 
			exit(Error)
	end.


В вышеуказанной функции я получаю NumberOfRows например равным шести. Я не нашел ничего лучше, как рекурсивно выполнить select_calls до тех пор, пока мне не сообщат об ошибке:

select_calls(Ref) ->
	case odbc:next(Ref) of 
		{selected,["CS_CALLED_STATION_ID","CS_CALLING_STATION_ID","CS_LOCALCALLID"], [{Caller,Called,SessionID}]} ->
			write_msg(Caller,Called,SessionID),
			select_calls(Ref);
	Error -> 
		io:format("end of data\n")
	end.


Запросить сразу лист записей, а потом сделать map или foreach нельзя, т.к. драйвер базы данных (Oracle) для unixODBC еще не дописан до конца (а фирменный от Oracle или другой коммерческий от Easysoft настолько проблемно ставится, что проще будет пока с этим повозиться) и не позволяет селектом выдавать сразу лист - только так, по одной записи.

Так вот, хотелось бы не дожидаться пока odbc:next выбросит ошибку, а выполнить его столько, сколько мне надо.

Как?
А то я что-то этот момент упустил пока. В туториалах есть много-много про параллельное программирование и кластеризацию ,а вот такой момент что-то обойдет вниманием.

Я хотел добавить лишний параметр в вызов функции, что-то вроде

select_calls(Ref, counter) ->
	if
		counter > 0 ->
			...
			select_calls(Ref, counter-1);
	end.


но это почему-то не работает.


(Читать комментарии) - (Добавить комментарий)

Re: вот так:
(Анонимно)
2011-09-01 10:56 (ссылка)
repeat(N, F)
when N>0 ->
F(), repeat(N-1, F);
repeat(N, F) -> ok.

(Ответить) (Уровень выше)


(Читать комментарии) -