comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » "include" a file
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
"include" a file [message #66991] Fri, 26 June 2009 12:50
JDS is currently offline  JDS
Messages: 94
Registered: March 2009
Member
Various other languages have the option to include and evaluate the
program contents of another file at runtime. IDL has the "@"
operator, but that happens at compile time, so you need to know which
file to include in advance. I find myself needing to drop small
"parameter" files in individual directories for a routine to process
as it crawls through. I could certainly prepare an IDL .sav file, or
some other data format, parse that, and set-up structures and
variables as needed, but that makes editing and updating the file very
painful. What IDL needs is a way to "include" a file directly, and
evaluate its contents. Finding nothing, I came up with the following
concept:

;; include -- Include and evaluate the IDL command contents of a file.
;; To use, give the variable "include_file" in the same scope the name
;; of a valid file containing IDL commands (batch syntax only), then
;; batch include this file, ala:
;;
;; include_file='/path/to/file'
;; @include
;;
_inc_lines=replicate('',file_lines(include_file))
openr,_inc_un,include_file,/get_lun
readf,_inc_un,_inc_lines
_inc_wh=where(~stregex(_inc_lines,'\$(;.*)?[ \t]*$',/
BOOLEAN),_inc_cnt)
_inc_start=0L
for _inc_i=0L,_inc_cnt-1 do begin
_inc_parts=_inc_lines[_inc_wh[_inc_i]]
if _inc_wh[_inc_i] gt _inc_start then $
_inc_parts=strjoin( $
reform((stregex(_inc_lines[_inc_start:_inc_wh
[_inc_i]-1],$
' *(.*) *\$(;.*)?[ \t]*$', $
/SUBEXPR,/EXTRACT))[1,*])) +
_inc_parts
_inc_void=execute(_inc_parts)
_inc_start=_inc_wh[_inc_i]+1L
endfor
free_lun,temporary( $ ; Clean-up all variables
(_inc_parts=temporary( $
(_inc_wh=temporary( $
(_inc_lines=temporary( $
(_inc_void=temporary( $
(_inc_cnt=temporary( $
(_inc_i=temporary( $
(_inc_start=temporary(_inc_un)))))))))))))))



This works just fine, collapsing multi-line commands, and executing
them, at the cost of temporarily polluting the current scope with
"_inc_" variables (these are left undefined after the @include). You
have to use "batch syntax", aka as "standalone single line command"
syntax, but for my purposes this isn't a major limitation. It uses
execute, so won't work in the IDL_VM, and if you try to do it many
times in a loop, you might regret it. But for quickly setting up
human-editable parameter lists, I find it works great.

Do others encounter this problem, and has anyone solved it in a
different way?

JD
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: Re: programming with itools
Next Topic: catalyst error

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Fri Oct 10 16:57:41 PDT 2025

Total time taken to generate the page: 0.79956 seconds