[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 20:30:10 +0800 |
On May 17, 2013, at 7:17 PM, Michael Goffioul wrote:
> On Thu, May 16, 2013 at 10:14 PM, Ben Abbott <address@hidden> wrote:
> 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]
>
> Thank you, Ben. Can I ask you what's the result with a fully valid classdef
> file? Does it also appear as a function and class in the package properties?
>
> Michael.
I added the foo_payment class form Octave's sources.
matlab> clear all
matlab> p = meta.package.fromName('pack')
p =
package with properties:
Name: 'pack'
ClassList: [2x1 meta.class]
FunctionList: [1x1 meta.method]
PackageList: [0x1 meta.package]
ContainingPackage: []
matlab> p.ClassList
ans =
2x1 class array with properties:
Name
Description
DetailedDescription
Hidden
Sealed
Abstract
ConstructOnLoad
HandleCompatible
InferiorClasses
ContainingPackage
PropertyList
MethodList
EventList
EnumerationMemberList
SuperclassList
matlab> p.ClassList.Name
ans =
pack.invalid_fun
ans =
pack.foo_payment
matlab> p.FunctionList
ans =
method with properties:
Name: 'invalid_fun'
Description: ''
DetailedDescription: ''
Access: 'public'
Static: 0
Abstract: 0
Sealed: 0
Hidden: 0
InputNames: {'rhs1'}
OutputNames: {'lhs1'}
DefiningClass: []
Ben