Фокус-покус - Лотус-Нотус скрип-т

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 491
367
#1
делай раз - создаем либу (test.lib) с декларой:
Код:
Class TestObj
Private testList List As String
Property Set ListStr(xKey) As String
testList(xKey)=ListStr
End Property
Property Get FullList As Variant
FullList=testList
End Property
End Class
делай два - агент:
Код:
Option Public
Option Declare
Use "test.lib"
Sub Initialize
Dim test As New TestObj()
test.ListStr("1")="One"
test.ListStr("2")="Two"
test.ListStr("3")="Three"
Forall t In test.FullList 
Print t
End Forall
End Sub
делай три - пущаем агент
получаем... - несовпадение типов

каментим Use...
суваем в деклару агента класс, из библы
сохраняем-пущаем - всё проходит!

оттакавот опа
Variant никак не кастится, ежели лист тяним из либы
 

vital

Больной Компом Детектед
29.01.2006
2 432
42
#2
Забавный, этот ваш лотус..
 

nvyush

Well-Known Member
Lotus team
22.04.2009
2 317
0
#3
Если в агенте написать так:
Код:
Sub Initialize
Dim test As New TestObj()
test.ListStr("1")="One"
test.ListStr("2")="Two"
test.ListStr("3")="Three"
Dim lst As Variant
lst = test.FullList 
Forall t In lst
Print t
End Forall
End Sub
то с либой работает. Прикольный глюк.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 226
25
#4
lmike
думаю дело тут таки в ForAll
я тоже ни раз замечал что переменный в нем конвертятся в "хитрый вариант"
просто пример:
имеем строковый массив a(0..10)
Код:
forall b in a
call TestSub(B) ' - если в этой процедуре указать на прийом жестко строковую переменную, то уже в процессе компиляции мы получаем ошибку
и писать нам приходится вот так:
Код:
call TestSub( (cstr(B) )
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 491
367
#5
я не против хитрой конвертации, я против зависимости от положения звёзд.../кода :lol:
forall удобен как тип цикла
с явным приведением - я сталкивался, но - це другой случАй :)
 

hosm

* so what *
18.05.2009
2 442
9
#6
нда, вот если в стартовом примере поменять принт на
Print t & "1"
то выведет 3 раза 1 :lol:

а если поизвращаться, то еще и так работает:
Код:
Forall t In test.FullList 
Print test.FullList(Listtag(t))
End Forall
(*прошу не бить ногами за такой изврат*)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 491
367
#7
подобный фокус получим и с бриджом LS2J
ежели в классе обратимся к полям класса java (public final int myConst=1;)
то, в случае вынесения LS рапера в библиотеку, поимеем невозможность получения Java Field
а реализация класса в агенте (по месту примения) такой ошибки не даст
для желающих поиграться - nsftools, LS2J экзампелы (прогрессбар)...
выносим класс агента в библиотеку - получаем ошибку
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#8
а по-моему это нормально, раз кодер "что угодно" пихает в вариант, значит в месте использования этого "чего угодно" он знает, что "оно" есть, и использует приведение к нужному типу..

и что должна выводить такая конструкция ?
Код:
Forall t In lst
Print t
End Forall
тег приведенный к строке или значение элемента тега ?

лучшим вариантом в работе со списками я считаю создание сначала некоторого типа, а затем списка этого типа, тогда вообще никаких проблем нет..

Код:
Type ABuser
fio As String
db As String
End Type

Dim usersAB List As ABuser

If Iselement ( usersAB( lname)) Then
usersAB( lname).fio = usersAB( lname).fio & DELIM & altName 
usersAB( lname).db = usersAB( lname).db & DELIM & server & DELIMDB & dbpath
Else
usersAB( lname).fio = altName
usersAB( lname).db = server & DELIMDB & dbpath
End If

forall note in usersAB	
print note.fio, note.db
endforall
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 491
367
#9
а Вы попробуйте...
или невнимательно прочитали? :(
там именно - низя привести ни к какому типу!
только вокэраунд как у nvy

это не рабочий код - это демонстрация и от того что лежит в листе не зависит
именно получение листа - как референса (а иначе придется итерировать с копированием) важно в этом примере
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#10
да, понял что там написано.. список в явном виде по ссылке не передается..
с другой стороны зачем его пихать в класс, если его обратно нужно вернуть (хотя, конечно, всякое бывает) ?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 491
367
#11
ну пихают в класс - чтобы клас его инициализировал и работал с ним..., а результат обработки - как массив
и глобальным его делать не хоца
разве не приходилось из ф-ций возвращать массивы? :(
 

Kee_Keekkenen

Well-Known Member
05.09.2006
639
6
#12
так то массивы.. обычно это уже чистые выжимки, а у вас задача иная..
что-то вроде - кинул начальных параметров, получил мегасписок, кинул параметров в функцию, получил выборку, другой набор параметров - другая выборка..
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 491
367
#13
нет - задача не иная :(
повторюсь - это концепт
хэши - суть массивы, то что его в LS обозвали List, не влияет на содержимое
допустим нужен агрегатор по ключу (суммы, счетчики, контектация строк...) - хэш самое оно
а затем сортануть ключи (в др. массиве), и вывести резалт