I quite possibly misunderstood your specifications. If I simply remove lines 2 and 11 from my gist, calc2 still reports three blocks. If I also remove the three blocks which appear between lines 2 and 11, calc2 will then report 0 blocks. Is that not what you wanted me to count?
Meanwhile, I do not concern myself very much with whether the boundaries of a region of text are "inside" or "outside" that region. Instead, I go with what seems simple to implement and then use the requirements to tweak the code so that the result is correct. Of course, the limitation here is that I need to understand your requirements. Another limitation is that new requirements will require new code (or manual work) - but that seems to me to be unavoidable. I expect that once we share an understanding of your requirements that an explanation of how the code is structured will make more sense. Thanks, -- Raul On Sun, Jan 12, 2014 at 6:50 AM, Joe Bogner <[email protected]> wrote: > Thanks for the sequential machine implementation. I tested with > different versions of the text block and it doesn't work as I > expected, which means I either relayed the requirements wrong or there > may be a bug > > For example, if I take out the first block of @{ }, it reports > > calc2 text > blocks 0 > max depth 1 > max block 25 > scripts 2 > max script 49 > > text =: 0 : 0 > @{ > Response.Write('start'); > } > <html> > <script> > alert('start'); > </script> > <div id='Foo'>@Page.Foo</div> > <script> > alert($('#Foo').val()); > </script> > > </html> > @{ > Response.Write('bye'); > } > ) > > My implementation posts the correct answer of two blocks - each pair > of @{ and the } that gets back to indent = 0. > > It looks like yours requires possibly a brace in the block to trigger > it as a code block. It also seems to be summing up the total amount > of code and script characters instead of finding the largest one. > > The Trace looks helpful to debug. > > I've read through the dictionary and nuvoc a few times for sequential > machine and I don't understand it well enough to help troubleshoot > your implementation. I'll spend more time with it. I didn't want to go > down that rabbit hole until I was sure it could provide a correct > result. > > I thought about posting to programming but was't sure how > philosophical it would get. Probably better to have started there and > then migrate here if it was philosophical. Feel free to move it to > programming since we're now on the details of the sequential machine > implementation. > > Thanks again. I appreciate the opportunity to learn. > > On Sat, Jan 11, 2014 at 10:16 PM, Raul Miller <[email protected]> wrote: >> Here's a draft that uses ;: >> >> https://gist.github.com/rdm/8380234 >> >> (As an aside, perhaps this thread should be on programming? Or at >> least, something to think about for next time...) >> >> Note that I get different character counts than you. Maybe I >> misunderstood what you intended to count? >> >> Let me know if you want me to clarify or rewrite any of that. >> >> But, briefly, I am using the final states from a ;: trace to mark the >> end of each "token" and then classifying the text based on that >> analysis. Since this sequential machine is a bit bulky, I decided to >> write a small application to build it rather than constructing it by >> hand. Since I only care about the state trace, I use no-op for all >> operations. Since I want the end state, I use 0 _1 0 0 for ijrd >> instead of the default 0 _1 0 _1. This leaves me with my final state >> being the "character position" after the last character in text (and >> it's reported in the trace rather than being an error condition). >> >> Thanks, >> >> -- >> Raul >> >> On Sat, Jan 11, 2014 at 4:47 PM, Joe Bogner <[email protected]> wrote: >>> Thank you for the thoughts. You summarized it well. >>> >>> I don't need to worry about attributes on the script tag for this use case. >>> I am interested in quantifying how much embedded javascript is in each of >>> the pages. I don't need to quantify external scripts. I know the code base >>> doesnt use the type="javascript" attribute >>> >>> The braces should be well formed otherwise the c# razor file wouldn't >>> compile. It is possible there may be an edgecase which can be found when I >>> run it against all the files. >>> >>> I plan to use it to identify areas to refactor in the javascript/c# razor >>> code base and then watch it improve over time. I also thought it would be >>> interesting to use a concise and expressive language, J, to measure the >>> more verbose code base. It doesn’t need to be precise in terms of >>> characters. For example, it is ok if the script tag characters are counted >>> as long as its consistent. I will be using it find large problem areas and >>> then measure the improvement. >>> >>> I would be interested in seeing the sequential machine approach or any >>> other more idiomatic method than mine. I am fairly satisfied with mine. It >>> is fairly clear to me and can likely ne extended if needed. I am trying to >>> use J more in my day to day and that would help me learn and hopefully >>> would be an interesting example for others. >>> >>> Thanks again >>> On Jan 11, 2014 4:11 PM, "Raul Miller" <[email protected]> wrote: >>> >>>> I think I see how I would do that with a sequential machine. Let me >>>> know if you want a working example. >>>> >>>> Briefly, though, you seem to have three kinds of token pairs: >>>> >>>> @{ } >>>> { } >>>> <script> </script> >>>> >>>> The ambiguity between the first two is problematic, in the context of >>>> errors, but does not matter in well formed cases. A bigger problem in >>>> the wild might be that you do not allow for attributes on the script >>>> tag. >>>> >>>> Also, you care about the number of characters between <script> >>>> </script> so those characters should be saved as "tokens" even if they >>>> are not curly braces. You care about {} between both @{ } and <script> >>>> </script> and outside them, and your implementation allows things like >>>> @{ <script> } </script>. >>>> >>>> A full wart-for-wart compatible version would be painful to write. A >>>> version which assumed well-formed cases would be much easier to write. >>>> But before thinking about coding up an implementation it's probably >>>> worth thinking about why you want to do this. The answer to that kind >>>> of question can be really interesting and can help identify which >>>> warts are unnecessary or possibly even detrimental. >>>> >>>> So, before I think any more about code, what are your thoughts on what >>>> you want to accomplish? >>>> >>>> Thanks, >>>> >>>> -- >>>> Raul >>>> >>>> >>>> On Sat, Jan 11, 2014 at 3:40 PM, Joe Bogner <[email protected]> wrote: >>>> > I have about 300 code files (javascript and embedded code) that I want >>>> > to collect some metrics on. I've written the algorithm using an >>>> > imperative style. I actually wrote it first in C# and translated to J >>>> > >>>> > Here is the code (posted a link for brevity): >>>> > >>>> > J version: >>>> > https://gist.github.com/joebo/936ca5e2017c0a3b5c56 >>>> > >>>> > C# version: >>>> > https://gist.github.com/joebo/e7f8e3ca7bd21117e58d >>>> > >>>> > This is what it outputs >>>> > >>>> > calc'' >>>> > blocks 3 >>>> > max depth 2 >>>> > max block 113 >>>> > scripts 2 >>>> > max script 26 >>>> > >>>> > Any suggestions on how to do it differently in J? I looked into the >>>> > sequential machine some but couldn't figure out how to make it work >>>> > (if it could) since my approach required knowledge of the brace depth. >>>> > >>>> > In terms of requirements: >>>> > 1. Take a block of text >>>> > 2. Identify the code blocks in the file (start with @{ and end with } ) >>>> > 3. Count the code blocks >>>> > 4. Determine the max depth of the code block >>>> > 5. Determine the max size of all the code blocks >>>> > 6. Count the javascript blocks >>>> > 7. Determine the max size of the javascript block >>>> > >>>> > Thanks for any feedback or input! >>>> > >>>> > Joe >>>> > ---------------------------------------------------------------------- >>>> > For information about J forums see http://www.jsoftware.com/forums.htm >>>> ---------------------------------------------------------------------- >>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>> >>> ---------------------------------------------------------------------- >>> For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
