whole_func_string: function() {
          var line = [];
          line.push(this.commandAssignment.value.name);
          Object.keys(this._assignments).forEach(function(name) {
              var assignment = this._assignments[name];
              var type = assignment.param.type;
              // TODO: This will cause problems if there is a non-default value
              // after a default value. Also we need to decide when to use
              // named parameters in place of positional params. Both can wait.
              if (assignment.value !== assignment.param.defaultValue) {
                  line.push(' ');
                  line.push(type.stringify(assignment.value));
              }
          }, this);
          return line.join('');
      }
func_code_string: function() {
          var line = [];
          line.push(this.commandAssignment.value.name);
          Object.keys(this._assignments).forEach(function(name) {
              var assignment = this._assignments[name];
              var type = assignment.param.type;
              // TODO: This will cause problems if there is a non-default value
              // after a default value. Also we need to decide when to use
              // named parameters in place of positional params. Both can wait.
              if (assignment.value !== assignment.param.defaultValue) {
                  line.push(' ');
                  line.push(type.stringify(assignment.value));
              }
          }, this);
          return line.join('');
      }
func_documentation_string: Extract a canonical version of the input