//============================================================================= // Некоторые примеры из статьи: "На пути к мобильным параллельным программам". // Открытые системы, №5-6. //============================================================================= //-------------------------------------------------------------------- // Функция, осуществляющая скалярное произведение двух векторов. // Используется параллельный список //.................................................................... // Примеры данных: // ((1,2,3),(4,5,6)) // ((3, 5), (-4, 2)) //.................................................................... // ScalMultVec << funcdef W { (W:#:[]:*) >> return } //-------------------------------------------------------------------- // Функция, суммирующая элементы вектора. //.................................................................... // Примеры данных: // (1,2,3,4,5,6) // (3, 5, -4, 2) // VecSum << funcdef Param { // Формат аргумента: (x1,... ,xn), где x1,... ,xn - числа Len<]):?]^ ( {Param:[]}, {Param:+}, { block { OddVec << Param:[(1,Len,2):..]; EvenVec << Param:[(2,Len,2):..]; ([OddVec,EvenVec]: VecSum):+ >>break } // конец блока } // конец задержанного списка ) } //-------------------------------------------------------------------- // Функция, выполняющая произведение двух векторов. // Древовидная свертка. Результатом является скаляр. //.................................................................... // Примеры данных: // ((1,2,3),(4,5,6)) => 32 //.................................................................... // VecMult<< funcdef x{ x:ScalMultVec:VecSum >> return } //-------------------------------------------------------------------- // Функция, осуществляющая сложение элементов вектора. // Используется правая свертка. //.................................................................... // Примеры данных: // (1,2,3,4,5,6) // (3, 5, -4, 2) //.................................................................... // SeqVecSum << funcdef Param { // Формат аргумента: (x1,... ,xn), где x1,... ,xn - числа Len<=]):?]^ ( {Param:[]}, {(Param:1, Param:-1:SeqVecSum) :+} ) } //-------------------------------------------------------------------- // Функция, выполняющая произведение двух векторов. // Правая свертка. Результатом является скаляр. //.................................................................... // Примеры данных: // ((1,2,3),(4,5,6)) => 32 //.................................................................... // SeqVecMult<< funcdef x{ x:ScalMultVec:SeqVecSum >> return }