[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Matlab test
From: |
Ben Abbott |
Subject: |
Re: Matlab test |
Date: |
Fri, 17 May 2013 10:14:21 +0800 |
On May 17, 2013, at 9:59 AM, Michael Goffioul wrote:
> On Thu, May 16, 2013 at 9:51 PM, Ben Abbott <address@hidden> wrote:
>
> On May 17, 2013, at 9:09 AM, Michael Goffioul wrote:
>
> > On Thu, May 16, 2013 at 8:34 PM, Ben Abbott <address@hidden> wrote:
> > On May 17, 2013, at 7:02 AM, Michael Goffioul wrote:
> >
> > > Hi,
> > >
> > > Can I ask anybody to make a test for me under Matlab. I'm trying to
> > > determine when Matlab actually parses files that are contained in a
> > > package. The only thing I can think of is to put a parse error into one
> > > of the files.
> > >
> > > So the test would be to have a package, not initially in your path, and a
> > > file (e.g. a function file) in that package, which contains a parse
> > > error. Then use "addpath" to make the package visible, that is adding the
> > > parent of the package directory to the path.
> > >
> > > So let's say you have the following: a/+pack/invalid_fun.m (invalid_fun.m
> > > has a parse error). Then try the following commands (if any of the
> > > command produces an error, don't bother going further):
> > >
> > > addpath a
> > > p = meta.package.fromName('pack')
> > > fcn = p.Functions{1}
> > > fcn()
> > >
> > > Michael.
> >
> > I used a trivial function
> >
> > function a = invalid_fun (a)
> > a = a .+ 1;
> > end
> >
> > Then ...
> >
> > addpath ('~/Documents/MATLAB/a')
> > matlab>p = meta.package.fromName('pack')
> >
> > p =
> >
> > package with properties:
> >
> > Name: 'pack'
> > ClassList: [0x1 meta.class]
> > FunctionList: [1x1 meta.method]
> > PackageList: [0x1 meta.package]
> > ContainingPackage: []
> >
> > matlab>fcn = p.Functions{1}
> >
> > fcn =
> >
> > method with properties:
> >
> > Name: 'invalid_fun'
> > Description: ''
> > DetailedDescription: ''
> > Access: 'public'
> > Static: 0
> > Abstract: 0
> > Sealed: 0
> > Hidden: 0
> > InputNames: {'rhs1'}
> > OutputNames: {'lhs1'}
> > DefiningClass: []
> >
> > matlab>fcn()
> >
> > ans =
> >
> > method with properties:
> >
> > Name: 'invalid_fun'
> > Description: ''
> > DetailedDescription: ''
> > Access: 'public'
> > Static: 0
> > Abstract: 0
> > Sealed: 0
> > Hidden: 0
> > InputNames: {'rhs1'}
> > OutputNames: {'lhs1'}
> > DefiningClass: []
> >
> > And I get no error. Have I done something wrong? I'm not familiar with
> > the meta.packages. How may I actually call the function?
> >
> > You actually call it with "pack.invalid_fun()".
>
> Ok. That triggers the parser.
>
> pack.invalid_fun(1)
> Error using pack.invalid_fun
> Error: File: invalid_fun.m Line: 2 Column: 10
> Unexpected MATLAB operator.
>
> > But the documentation says that the "Functions" property return a cell
> > array of function handles. Apparently, there's some confusion about what
> > "function handle" means. In this case, it looks like it is a meta.method
> > object instead (and meta.method class inherits from handle class).
> >
> > This makes me wonder what would be the result if
> > 1) the parse error was in the function definition line instead
>
> I changed the function to ...
>
> function a = invalid_fun (a++)
> a = a;
> end
>
> matlab> clear all
> matlab> p = meta.package.fromName('pack')
>
> p =
>
> package with properties:
>
> Name: 'pack'
> ClassList: [0x1 meta.class]
> FunctionList: [1x1 meta.method]
> PackageList: [0x1 meta.package]
> ContainingPackage: []
>
> matlab> fcn = p.Functions{1}
>
> fcn =
>
> method with properties:
>
> Name: 'invalid_fun'
> Description: ''
> DetailedDescription: ''
> Access: 'public'
> Static: 0
> Abstract: 0
> Sealed: 0
> Hidden: 0
> InputNames: {'rhs1'}
> OutputNames: {'lhs1'}
> DefiningClass: []
>
> >> pack.invalid_fun (1)
> Error using pack.invalid_fun
> Error: File: invalid_fun.m Line: 1 Column: 28
> Unexpected MATLAB operator.
>
> > 2) invalid_fun.m was an invalid classdef definition file instead: I would
> > expect it to appear in p.Classes instead, though if the parse error is in
> > the classdef line (for instance "classde invalid_class < handle"), what
> > would it do?
>
> You'd like the content of invalid_fun.m to be ...
>
> classde invalid_class < handle
> end
>
> Using this I get ...
>
> matlab> clear all
> matlab> p = meta.package.fromName('pack')
>
> p =
>
> package with properties:
>
> Name: 'pack'
> ClassList: [0x1 meta.class]
> FunctionList: [1x1 meta.method]
> PackageList: [0x1 meta.package]
> ContainingPackage: []
>
> matlab> fcn = p.Functions{1}
>
> fcn =
>
> method with properties:
>
> Name: 'invalid_fun'
> Description: ''
> DetailedDescription: ''
> Access: 'public'
> Static: 0
> Abstract: 0
> Sealed: 0
> Hidden: 0
> InputNames: {'rhs1'}
> OutputNames: {'lhs1'}
> DefiningClass: []
>
> matlab> pack.invalid_fun (1)
> Error using pack.invalid_fun
> Error: File: invalid_fun.m Line: 2 Column: 1
> Illegal use of reserved keyword "end".
>
>
> Thanks, Ben. And what if:
> 1) the classdef file is valid
> 2) the classdef file is not valid but the parse error is a typo in the "end"
> keyword (the "classdef" line is valid)
>
> Michael.
I used ...
classdef invalid_class < handle
end
and got (not really a valid classdef since I'm using "invalid_class" and not
the name of the m-file, "invalid_fun")
clear all
matlab> p = meta.package.fromName('pack')
p =
package with properties:
Name: 'pack'
ClassList: [0x1 meta.class]
FunctionList: [1x1 meta.method]
PackageList: [0x1 meta.package]
ContainingPackage: []
matlab> fcn = p.Functions{1}
fcn =
method with properties:
Name: 'invalid_fun'
Description: ''
DetailedDescription: ''
Access: 'public'
Static: 0
Abstract: 0
Sealed: 0
Hidden: 0
InputNames: {'rhs1'}
OutputNames: {'lhs1'}
DefiningClass: []
matlab> pack.invalid_fun (1)
Error using pack.invalid_fun
Error: File: invalid_fun.m Line: 1 Column: 10
Class name and filename do not agree.
With the contents of invalid_fun.m being ...
classdef invalid_fun < handle
endx
I get ...
clear all
matlab> p = meta.package.fromName('pack')
p =
package with properties:
Name: 'pack'
ClassList: [1x1 meta.class]
FunctionList: [1x1 meta.method]
PackageList: [0x1 meta.package]
ContainingPackage: []
matlab> fcn = p.Functions{1}
fcn =
method with properties:
Name: 'invalid_fun'
Description: ''
DetailedDescription: ''
Access: 'public'
Static: 0
Abstract: 0
Sealed: 0
Hidden: 0
InputNames: {'rhs1'}
OutputNames: {'lhs1'}
DefiningClass: []
matlab> p.ClassList
ans =
class with properties:
Name: 'pack.invalid_fun'
Description: ''
DetailedDescription: ''
Hidden: 0
Sealed: 0
Abstract: 0
ConstructOnLoad: 0
HandleCompatible: 1
InferiorClasses: {0x1 cell}
ContainingPackage: [1x1 meta.package]
PropertyList: [0x1 meta.property]
MethodList: [18x1 meta.method]
EventList: [1x1 meta.event]
EnumerationMemberList: [0x1 meta.EnumeratedValue]
SuperclassList: [1x1 meta.class]
Ben