annotate doc/v2_planning/arch_src/plugin_JB_comments_IG.txt @ 1217:c0515c0dfef9

Wrote a sphinx extension for a taglist directive that outputs a javascript tag list and related functions
author boulanni <nicolas_boulanger@hotmail.com>
date Wed, 22 Sep 2010 12:49:41 -0400
parents 4754661ad6ab
children f68b857eb11b
rev   line source
1213
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
1 -Does everything have to be all caps? I know I will get annoyed with that.
1215
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
2 - JB replies: I chose caps because
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
3
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
4 a) I wanted to be able to use statements like IF, WHILE, etc. that are
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
5 reserved words in Python in lower case... but this turned out not to be a
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
6 large overlap
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
7
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
8 b) I wanted to make up for the lack of syntax highlighting of control flow
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
9 statements in VIM by making the words bigger.
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
10
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
11 c) I thought it looked kinda retro-cool.
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
12
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
13 Neither of these reasons is really strong, if you or others have strong
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
14 feelings against caps then no problem.
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
15
1213
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
16 -Regarding overall program structure:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
17 Do you think there might be an easier to read/type way of specifying programs than building them out of constructors? This seems like it's going to lead to unwieldy proliferation of parentheses, like in LISP, but since it's an imperative language it's more likely that we'll have lots of different scopes visible at the same time, and it will be hard to tell which section is nested inside which other section if they're all just a bunch of constructor calls fed to each other.
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
18 Right now it just seems to take a few layers of SWITCH and SEQ to end up with an unreadable mess:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
19 I know I'm not getting the syntax exactly matched to you proposal, but just to illustrate what I'm saying, we could have a program that looks like this:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
20 program = SEQ( A, B, SWITCH(var1, val1_1, C, val_1_2, SWITCH(var2, val_2_1, D, val_2_2, E) ) , F, SWITCH(var3, val_3_1, G, val_3_2, H) )
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
21 This seems like it could quickly turn into a nightmare, trying to count parentheses everywhere. An alternative to make it more parseable is:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
22
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
23 switch1 = SWITCH(var2, val_2_1, D, val_2_2, E)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
24 switch2 = SWITCH(var1, val1_1, C, val_1_2, switch1)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
25 switch3 = SWITCH(var3, val_3_1, G, val_3_2, H)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
26 program = SEQ( A, B, switch2 , F, switch3)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
27
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
28 This is a lot more manageable but now the parts are out of order, so the cognitive load required to debug and understand it doesn't scale well with program size.
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
29
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
30 It would be much nicer if, since it is a programming language, we could write:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
31
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
32 A
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
33 B
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
34 SWITCH var1
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
35 val1, C
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
36 val_1_2, SWITCH var2
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
37 val_2_1, D
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
38 val_2_2, E
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
39 F
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
40 SWITCH var3
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
41 val_3_1, G
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
42 val_3_2, H
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
43
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
44 I can see a few different ways of accomplishing this, but of couse welcome more proposals:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
45
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
46 1) Make a scripting language, so we pass a file into our library. We could base it on XML, maybe, if we didn't want to spend too much time making our own parser:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
47
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
48 switch.xml contains:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
49 <PyLearn>
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
50 <A />
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
51 <B />
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
52 <Switch var="var_1">
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
53 <Branch val="val_1_1">
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
54 <C>
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
55 </Branch>
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
56 ...
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
57 </Switch>
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
58 </Pylearn>
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
59
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
60 python pylearn.py switch.xml
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
61
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
62 2) We could make a global program compiler or have program objects that have an idea of the current scope, that you just add things to:
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
63
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
64 p = pylearn.program()
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
65 p(A)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
66 p(B)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
67 p(SWITCH(var1))
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
68 p( Branch(val_1_1, C)) #one annoying thing is python wouldn't let us indent things as we please
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
69 ...
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
70 p(END_SWITCH)
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
71 ...
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
72 p.compile()
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
73 p.run()
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
74
33513a46c41b added comments on plugin_JB
Ian Goodfellow
parents:
diff changeset
75 If we design our language to be LL(1) (fairly easy to do) then it's pretty easy to make p check that the calls to it are syntactically correct as they happen.
1215
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
76
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
77
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
78 JB replies:
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
79
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
80 What I've proposed so far is a few classes for adding new program-flow
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
81 constructs to Python, which is I think less ambitious and more desirable than
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
82 defining a separate language. For example, the bodies of the CALL objects are
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
83 all python methods (not implemented in my - i hesitate to all it a -
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
84 "language") and the program itself is constructed using *python* control flow
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
85 and *python* methods. I don't want to have another set of syntax rules, or
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
86 have to create a macro system, or a pre-processor.
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
87
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
88 I agree it would be nicer to have a more elegant syntax, but I'd much rather
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
89 live with a few extra parentheses than require someone to go to the trouble of
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
90 implementing that luxury. (And we can tweak the control-flow constructors to
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
91 minimize the number of brackets & parentheses too).
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
92
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
93 Besides, we can always implement that language & compiler later. For now we
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
94 can just type the extra brackets.
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
95
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
96 Perhaps I don't understand your first example - where do the definitions of A
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
97 and B come from? Must they be in the same file higher up or something? In
4754661ad6ab reply to plugin_JB_comments_IG
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 1213
diff changeset
98 what language will they be defined?