Вот набросок кода, который вы обрисовали в общих чертах:
Object o
Object ol
Link l
Module m = current Module
For o in entire(m) do{
if (o."IDNUM" != ""){
print o."IDNUM" ""
print o."text" ""
//HERE I WOULD LIKE TO ALSO PRINT EVERY TEXT IN OBJECT "LOWER" THAN o
for l in o --> "*" do{
ol = target(l)
print ol."text" ""
//HERE I WOULD LIKE TO ALSO PRINT EVERY TEXT IN OBJECT "LOWER" THAN ol
}
}
}
Есть несколько небольших синтаксических вещей, которые необходимо изменить здесь, но большое изменение заключается в том, как вы обрабатываете связанные элементы.Ссылки «живут» в исходном модуле, но они хранят только ограниченный объем информации, в основном это модули, являющиеся источником и целью ссылки, и абсолютные числа объектов, к которым они прикасаются.Поэтому вам нужно проверить, открыт ли модуль на другой стороне, прежде чем пытаться читать текст с него.
И поскольку вы пытаетесь просмотреть всю структуру ссылок, вам понадобится рекурсивный элемент дляэто.
Я бы, вероятно, в конечном итоге что-то вроде этого:
//turn off run limit timer- this might take a bit
pragma runLim , 0
Object o
Module m = current Module
// Recursive function- assumes each object has a text attribute- will error otherwise
void link_print(Object obj) {
print obj."text" "\n"
Link out_link
Object next_obj = null
for out_link in obj -> "*" do {
// Set the next object in the chain
next_obj = target ( out_link )
// This might return null if the module is not loaded
if ( null next_obj ) {
// Load the module in read-only mode, displayed and in standard view
read ( fullName ( ModName_ target ( out_link ) ) , true , true )
// Try and resolve out 'target' again
next_obj = target ( out_link )
// If it doesn't work, print a message so we can figure it out
if ( null next_obj ) {
print "Error Accessing Object " ( targetAbsNo ( out_link ) )""
} else {
//Iterate down structure
link_print ( next_obj )
}
} else {
//Iterate down structure
link_print ( next_obj )
}
}
}
for o in entire(m) do {
// Note that I cast the result of o."IDNUM" to a string type by appending ""
if (o."IDNUM" "" != ""){
print o."IDNUM" "\n"
// Recurse
link_print(o)
print "\n"
}
}
Примечание!В зависимости от размера вашей структуры ссылок, т. Е. Сколько у вас уровней (и если есть какие-либо шаблоны циклических ссылок), это может быть довольно ресурсоемкой задачей, и ее лучше решить с помощью чего-то другого, чем команды «print» (например,например, добавив его в текстовый файл, чтобы вы знали, как далеко он прошел до того, как произошла ошибка)
Удачи!
РЕДАКТИРОВАТЬ:
Вместо рекурсивного сниженияэтот сценарий теперь будет проходить один уровень, но должен сообщать о дочерних объектах.
//turn off run limit timer- this might take a bit
pragma runLim , 0
Object o
Module m = current Module
// Recursive function- assumes each object has a text attribute- will error otherwise
void link_print(Object obj) {
print obj."text" "\n"
Link out_link
Object next_obj = null
Object child_obj = null
for out_link in obj -> "*" do {
// Set the next object in the chain
next_obj = target ( out_link )
// This might return null if the module is not loaded
if ( null next_obj ) {
// Load the module in read-only mode, displayed and in standard view
read ( fullName ( ModName_ target ( out_link ) ) , true , true )
// Try and resolve out 'target' again
next_obj = target ( out_link )
// If it doesn't work, print a message so we can figure it out
if ( null next_obj ) {
print "Error Accessing Object " ( targetAbsNo ( out_link ) )""
} else {
// Loop and report on child objects
for child_obj in next_obj do {
print child_obj."text" "\n"
}
}
} else {
// Loop and report on child objects
for child_obj in next_obj do {
print child_obj."text" "\n"
}
}
}
}
for o in entire(m) do {
// Note that I cast the result of o."IDNUM" to a string type by appending ""
if (o."IDNUM" "" != ""){
print o."IDNUM" "\n"
// Recurse
link_print(o)
print "\n"
}
}