namespaces, etc.

John W. Eaton jwe at bevo.che.wisc.edu
Fri Feb 1 02:17:20 CST 2008


On  1-Feb-2008, John W. Eaton wrote:

| OTOH, I think it would be fairly easy to provide functions like
| 
|   create_symbol (NAME)  ## place NAME in current symbol table scope
| 
|   symbol_value (NAME)   ## value of symbol in current scope (could be
|                         ## variable, function, private function, class
|                         ## method, etc.)
| 
|   variable_value (NAME)   ## like symbol_value, but only look at the
|                           ## variable slot corresponding to the symbol
|                           ## NAME in the current scope
| 
|   set_variable (NAME, VALUE)  ## set the variable slot corresponding
|                               ## to the symbol NAME in the current
|                               ## scope to VALUE
| 
| and so on (there might be other useful get/set functions in addition
| to these).

To expand on this just a bit, here are set_variable and variable_value
(for CVS Octave only because the symbol table code was completely
rewritten to support classes, so it is not at all compatible with
3.0.x or earlier versions of Octave):

DEFUN (set_variable, args, , "set_variable (NAME, VALUE)")
{
  octave_value retval;

  if (args.length () == 2)
    {
      std::string name = args(0).string_value ();

      if (! error_state)
	symbol_table::varref (name) = args(1);
      else
	error ("set_variable: expecting variable name as first argument");
    }
  else
    print_usage ();

  return retval;
}

DEFUN (variable_value, args, , "VALUE = variable_value (NAME)")
{
  octave_value retval;

  if (args.length () == 1)
    {
      std::string name = args(0).string_value ();

      if (! error_state)
	{
	  retval = symbol_table::varval (name);

	  if (retval.is_undefined ())
	    error ("variable_value: `%s' is not a variable in the current scope",
		   name.c_str ());
	}
      else
	error ("variable_value: expecting variable name as first argument");
    }
  else
    print_usage ();

  return retval;
}


With these functions, I see:

  octave:1> varname = "foo"
  varname = foo
  octave:2> foo
  error: `foo' undefined near line 2 column 1
  octave:2> set_variable (varname, 42)
  octave:3> variable_value (varname)
  ans =  42
  octave:4> foo
  foo =  42
  octave:5> clear foo
  octave:6> variable_value (varname)
  error: variable_value: `foo' is not a variable in the current scope
  octave:6> foo
  error: `foo' undefined near line 6 column 1

jwe


More information about the Octave-maintainers mailing list