<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 03 Apr 2013, at 16:25, Xiangrong Fang wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Monaco; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div><blockquote type="cite">It's because in Pascal you need to declare types first.<br></blockquote><br>But why array[0..10] of Integer, or string[255] are not "types"?</div></span></blockquote><div><br></div><div>They are type definitions. Parameter lists cannot contain type definitions, only previously defined types. The main reason is that defining the same structured type multiple types results in different types. E.g.:</div><div><br></div><div>***</div><div><div>unit tt7;</div><div><br></div><div>interface</div><div><br></div><div>type</div><div>  ta = array[0..10] of Integer;</div><div>  tb = array[0..10] of Integer;</div><div><br></div><div>procedure test(a: ta);</div><div>procedure test(b: tb);</div><div><br></div><div>implementation</div><div><br></div><div>procedure test(a: ta);</div><div>begin</div><div>end;</div><div><br></div><div>procedure test(b: tb);</div><div>begin</div><div>end;</div><div><br></div><div>end.</div><div>***</div></div><div><br></div><div>The compiler can match the interface and implementation definitions based on the fact that the type definitions match (note, "type definitions" and not "type names" — i.e., you can add "type tc = ta" and change the "a: ta" into "a: tc" only in the implementation, and it will still compile because the type definitions still match).</div><div><br></div><div>However, if you would have</div><div><br></div><div>  procedure "test(a: array[0..10])"</div><div><br></div><div>in the interface, there would be no way for the compiler to match the implementation to the interface because in both cases a new definition would be created. This is a fundamental aspect of how Pascal's type system works.</div><div><br></div></div><div><blockquote type="cite"><div>Remember<br>that you can use "open array" in function params anyway.<br></div></blockquote></div><br><div>An "open array" is a special case. It even can only appear inside parameter lists, and there is no way to define a standalone "open array" type.</div><div><br></div><div><br></div><div>Jonas</div></body></html>