Explain the use of full-stop/period/point in a paragraph - cobol

I use COBOL in my business and I originally learned at a a site using perform - thru ....
Now I have changed jobs and the local programming standards are different, so I need to get used to PERFORM without THRU.
I also have a doubt about the use of the full-stop/period/point in a paragraph.
You can use the period to end sentences within a paragraph. I say this because I read in places that the paragraph ends with the first point, and elsewhere I see full-stop/period/point used differently to that.
I wrote two structures below which I understand should be equal. Is that so?
Structure A:
PERFORM 100-WRITING.
PERFORM 200-FINISH.
100-WRITING.
*-----------
DISPLAY "HI MY NAME IS FELIPE".
DISPLAY "THE WORLD IS GREAT".
DISPLAY "I DONT SPEAK ENGLISH".
200-FINISH.
*----------
DISPLAY "BYE BYE BABY".
DISPLAY "ESTO ES TODO".
Structure B:
PERFORM 100-WRITING.
PERFORM 200-FINISH.
100-WRITING.
*-----------
DISPLAY "HI MY NAME IS FELIPE"
DISPLAY "THE WORLD IS GREAT"
DISPLAY "I DONT SPEAK ENGLISH".
200-FINISH.
*----------
DISPLAY "BYE BYE BABY"
DISPLAY "ESTO ES TODO".

You are correct, the code you show is equivalent.
A paragraph or a SECTION must end with a full-stop/period/point. This means that the last thing (other than a comment or a blank line) in a paragraph or a SECTION must be a full-stop/period/point.
This does not mean that a full-stop/period/point actually ends a paragraph or SECTION. You are correct, a full-stop/period/point in a paragraph ends a sentence. A paragraph or SECTION must contain sentences only. Therefore a paragraph or SECTION must end with a full-stop/period/point because a sentence must end with one.
PERFORM 100-WRITING
PERFORM 200-FINISH
.
100-WRITING.
*-----------
DISPLAY "HI MY NAME IS FELIPE"
DISPLAY "THE WORLD IS GREAT"
DISPLAY "I DONT SPEAK ENGLISH"
.
200-FINISH.
*----------
DISPLAY "BYE BYE BABY"
DISPLAY "ESTO ES TODO"
.
Since the 1985 COBOL standard, sentences are no longer really important in COBOL in the PROCEDURE DIVISION, so it is only extra work if they are made important by the coder.
I find it much more convenient to re-write like the above. Don't attach the full-stop/period/point to anything. Just have it on in a line of its own. Then it means you can move around any of the lines in a paragraph/SECTION without worrying about whether the full-stop/period/point is in the correct place, because it is not actually attached to anything, so it never gets move around until you need it for the next paragraph/SECTION.
However, your site coding standards may not allow you to do this. You could always attempt to get them changed for the better :-)

Related

"Google Translate internal error" when using the GOOGLETRANSLATE function in Google Sheets

I have a large spreadsheet with a list of English phrases/words in one column and then another column where all of those are translated into another language using the GOOGLETRANSLATE function. One example of such a row:
The formula is =GOOGLETRANSLATE(G786, "en", "nl")
When I click on it a box appears saying "Error" and then beneath that
"Google Translate internal error."
I am unsure what the issue is and how I can solve it. The strange thing is that if I change the formula to replace the cell number to a plain string like "Hello" and click enter it will properly translate it to Dutch, and actually if I re-insert the same formula shown in the picture with the cell number it actually translates it as expected.
EN
NL
Confirm before proceeding
=GOOGLETRANSLATE(G777, "en", "nl")
try in H2:
=BYROW(G2:INDEX(G:G; MAX((G:G<>"")*ROW(G:G)));
LAMBDA(x; GOOGLETRANSLATE(x; G1; H1))
The Googletranslate function appears to create this internal error when there is more than one possible meaning of a word or sentence
e.g. when I type "one" (1). which also has the meaning of united etc. it creates an error but it translates "one dog" correctly.
To get a list of verbs, I wrote e.g. "to love" . It created an error , it seems because "to love" is not just an infinitive but can can include the meaning "in order to love" .
So it seems the googletranslate function works much better with sentences where the translation is unique, than it does with single or a few words.
Writing period/ full stops "." after a short sentence or phrase also removes this internal error
This seems to be a new problem because I've been using GOOGLETRANSLATE for about five years on lots of spreadsheets (vocabulary translations with thousands of entries). They have had a habit of timing out and becoming unusable. This error seems to have replaced the timing out. The period seems to have worked, so I just need to REGEXREPLACE it in the translation, I guess. And I need to do some more copy-and-paste-values-only once I have good translations.
=REGEXREPLACE(GOOGLETRANSLATE(concatenate(E430,"\."),"en","es"),"\\\.","")
adds the period, translates, and then removes it (but it strips the \ from the comments so I can't show it here!)

What is Amazon Lex inbuilt slot type for description or notes?

I have configured my AWS Lex bot to 'Schedule A Meeting' and 'Add Notes' tasks.
While meeting scheduling I have a slot 'Meeting Description' where user can add single word to a sentence. Similarly for adding notes I have 'Notes'.
For this slot I am not finding any inbuilt slot type like 'AMAZON.Description' or anything which can store a word or a sentence. I tried with 'AMAZON.VideoGame', 'AMAZON.FoodEstablishment' etc. But found intermittent issue with those. Some times they work and some times they don't.
Does any body know what type of slot type I can use for my case? Please share.
You will want to use a Custom SlotType if you want to catch an input of anything.
When you "train" this SlotType by giving it values, you should include a wide variety, such as numbers, single letters, single words, phrases, and whole sentences.
Even that won't always catch what you want though. So even better than that, is to use your Lambda Function to parse and validate the entire input yourself. And most likely, just set your slot value to be the entire input string.
For example:
User: "Add to my notes"
Bot: "Ok, what would you like me to save in your notes?"
User: "Buy more toilet paper."
Now the user expects the entire phrase to be in the note. You will have to use utterances in your Custom SlotType like this:
I want to {note}
Go {note}
Buy {note}
{note}
Those utterances will sometimes leave out some words and in the example, place only "more toilet paper" without the "buy" as your slot value. This is why you will want to parse the entire input yourself. So in Lambda you can get the entire input from inputTranscript.
userInput = event.inputTranscript // "Buy more toilet paper"
slotNote = event.currentIntent.slots.note // "more toilet paper"
Then you can compare those two and do some fancy validation yourself, or just save the user input directly into the note slot.
userInput = event.inputTranscript // "Buy more toilet paper"
event.currentIntent.slots.note = userInput // overwrites note slot value with correct full user input.

How to get the current paragraph name?

I would like to know how to get the current paragraph name in COBOL (using MVS Enterprise COBOL V4.2 here).
Let's say I have this code in the PROCEDURE DIVISION :
MAIN-LOGIC.
MOVE SPACE TO ABT-MSG
PERFORM PARAGRAPH-1
PERFORM PARAGRAPH-2
GO TO CLOSE-PROGRAM.
*
* SEARCH FOR A VALUE IN AN ARRAY AND GET THE RELATED INDEX
*
PARAGRAPH-1.
MOVE 42 TO SEARCH-VALUE
PERFORM VARYING I-SEARCH FROM 1 BY 1
UNTIL SOME-ARRAY(I-SEARCH) = SEARCH-VALUE
IF (I-SEARCH = MAX-ARRAY-POSITION)
MOVE SEARCH-ABORT TO ABT-MSG
MOVE 'PARAGRAPH-1' TO ABT-LOC
GO TO CLOSE-PROGRAM
END-IF
END-PERFORM
DISPLAY 'VALUE WAS FOUND AT POSITION ' I-SEARCH '.'.
*
* STORE A NEW VALUE AT THE END OF AN ARRAY
*
PARAGRAPH-2.
MOVE 42 TO STORAGE-VALUE
ADD 1 TO I-STORAGE
IF (I-STORAGE > MAX-ARRAY-POSITION)
MOVE STORAGE-ABORT TO ABT-MSG
MOVE 'PARAGRAPH-2' TO ABT-LOC
GO TO CLOSE-PROGRAM
END-IF
MOVE STORAGE-VALUE TO SOME-ARRAY(I-STORAGE).
*
* CLOSE THE PROGRAM
*
CLOSE-PROGRAM.
IF ABT-MSG > SPACE
DISPLAY ABT-MSG
DISPLAY '(FOUND IN ' ABT-LOC ')'
MOVE 20 TO RETURN-CODE
ELSE
DISPLAY SUCCESS-MESSAGE
END-IF
STOP RUN.
I would like to be able to access the current paragraph name (and store it in ABT-LOC) instead of having to write it.
Is there a COBOL system variable to do so, like 'CURR-PARA-NAME' or something ?
Thank you.
------ UPDATE 1 -------
I have updated my code example to make it more specific.
Know that, in my real COBOL program, there are various occurences of SEARCH-ABORT and STORAGE-ABORT possibilities (I am working with many arrays).
I want to make my code as good as possible, hence my will to access the current paragraph name instead of having to write it.
Thank you again.
------- UPDATE 2 ------
Well then. It seems I cannot do it (the users of my program will probably reject any debug messages they are not used to get - For your information, I am rewriting a 50 years old program with very, very bad programming practices such as upward GO TOs, fall-through logic and the godforsaken ALTER, and I want to get the same output at the end).
Don't worry, I will not cry tonight. This was just an esthetical improvement to my code, and I can live without it (my code is already a lot prettier than what I based myself on).
I thank all of you for your time, and wish you a good... Stack Overday !
As Simon Sobisch has correctly indicated in his answer, the only way to do exactly what you want is to use the "debugging declaratives". See later in the answer for making that work, but no-one should allow you to do this to a Production program.
COBOL is a compiled language so there is no no automatic access to any data-name or procedure name (paragraph or SECTION) unless the compiler makes something available. Which, excluding the case above, it doesn't.
That leaves three approaches: doing it manually (which you correctly want to avoid, as sure as peaches someone is going to copy or relocate code without changing the literal); pre-processing (with a program or the editor) to automatically populate your field with the correct label; doing something else.
Since you are implicitly discounting the first, again I believe correctly, let's consider the second. What if you have two, three or eight things in the same paragraph/SECTION which are all "business errors" (although usually these types of things are more "integrity errors", a state which should not exist, so don't continue)?
Since you will get those, a "pre-processing" solution starts to get more ugly.
What else can be done?
Well, it's something we've faced for many, many years. The answer is, unique (within the program) error numbers. The individual errors can be named, well, and given a number. The well-named error reference is difficult to use "incorrectly". When adding a new error, it is difficult to duplicate an existing number. Or, to put it another way, it is easy to duplicate but horribly easy to spot in testing - "hey, that's produced 1234, that's wrong".
It's in no way bullet-proof, but the data-name (and any associated text) give better indication of the problem than a paragraph-name (which is not going to be, except artificially, any indication of what the error is, just the location of it). The error references are very easy to find in the program, and from that it is easy to locate the procedure name, except you don't actually need it any more.
Whether the program with error-numbers outweigh the dross of manually maintained MOVE 'literal' TO some-standard-name programs is unknown. But you can guess which I favour and recommend.
Now, how to do it for Enterprise COBOL with DECLARATIVES.
IDENTIFICATION DIVISION.
PROGRAM-ID. STAB39.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. FRED DEBUGGING MODE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8).
01 ABT-LOC PIC X(30).
PROCEDURE DIVISION.
DDECLARATIVES.
DSOME-SECTION SECTION.
D USE FOR DEBUGGING ON ALL PROCEDURES
D .
DSOME-PARA.
D MOVE DEBUG-NAME TO ABT-LOC
D .
DEND DECLARATIVES.
STARTING-UP SECTION.
DISPLAY
ABT-LOC
D DISPLAY
D "IT IS STARTING UP"
MOVE WHEN-COMPILED TO W-WHEN-COMPILED
DISPLAY
"STAB39 "
W-WHEN-COMPILED
.
A-PARA.
DISPLAY
ABT-LOC
PERFORM
10 TIMES
D DISPLAY
"ITERATING"
END-PERFORM
.
ANOTHER-PARA.
DISPLAY
ABT-LOC
PERFORM THE-PARA
10 TIMES
PERFORM THE-SECOND-PARA
GOBACK
.
THE-PARA.
DISPLAY
ABT-LOC
.
THE-SECOND-PARA.
DISPLAY
ABT-LOC
.
Some notes:
The SOURCE-COMPUTER paragraph is required to use COBOLs in-built debugging features, to turn them on. So the ENVIRONMENT DIVISION and CONFIGURATION SECTION are also required. The "computer name", FRED in the example, is required, but it is irrelevant. You can "name" your computer after your favourite pet or relative if you like, or put anything there, there just has to be something.
DECLARATIVES can only be specified at the start of the PROCEDURE DIVISION. They must be within a SECTION and all actions must be within a paragraph belonging to a SECTION. The names of the SECTION and paragraph are irrelevant, but make them meaningful anyway.
Because the DECLARATIVES must contain a SECTION, you will be subject to an informational diagnostic message if your first procedure label is not also a SECTION. This does not require using SECTIONS over paragraphs in your program, it has no further effect.
The D in column seven indicates a "debugging line". These lines only get code generated when you turn debugging on with the SOURCE-COMPUTER paragraph.
The program exercises all use of a paragraph (and use of a SECTION is no different for this example) except GO TO. Paragraphs which are GO TO'd will produce the same results as any other reference, but you won't see GO TOs in my programs :-)
It is possible to name the procedure or procedures you want to "trap" with the DECLARATIVES instead of using "ALL PROCEDURES".
You may have multiple DEBUGGING procedures, and you can include extensive code within them if you wish (setting up conditions for testing, for instance).
Although this feature has existed in COBOL for a long time, it is probably fair to say that it is not widely used, especially as specific "debugging products" became available.
It is not enough just to have this program, the "run time" needs to have DEBUG turned on, if it is not the default. The run-time on z/OS is called Language Environment and is shared by multiple languages (allowing easy inter-language communication). Languages include C/C++, PL/I and Java as well as COBOL. There are Language Environment routines and macros available to make HLASM/Assembler programs "LE Compliant" to also provide ready interfacing.
To see what run-time options your site has as default, the easiest thing to do is to include a CEEOPTS DD statement in your run JCL.
//CEEOPTS DD *
RPTOPTS(ON)
This will list out all the options used for your "Enclave" (your run environment) and indicate where each option is sourced from.
If, in the OPTION column, you see NODEBUG, then COBOL debugging is turned off by default. To turn it on for a particular run:
//CEEOPTS DD *
DEBUG
This will allow all the D-labelled debugging lines and the debugging DECLARATIVES to execute.
This will do what you want, but no-one will allow a program with debugging on into Production, so you can't use it for what you want.
In order of preference, I advise error-numbers (and testing), automation, hand-coded procedure-name literals.
IBM fully documents all its products, and you can find the documentation (Language Reference and Programming Guide amongst others) for Enterprise COBOL V4.2 and also Language Environment (several) for your release of z/OS.
One final point. Don't use GO TO to "break out" of your normal processing flow. Use PERFORM. Even when, logically, the PERFORM cannot return. Using GO TO will turn off compiler optimisation for paragraphs/SECTIONs containing the GO TO which can easily cause a noticeable impact on execution. This is the reverse of the advice from before IBM COBOL ensured that the state of PERFORMed paragraphs/SECTIONs is not preserved between CALLs. At that time the correct advice was to use GO TO. It is no longer the correct advice.
As you have the pseudo-code "something bad happened here" I assume an exception. In this case the standard (COBOL 2002, COBOL 2014) function EXCEPTION-LOCATION may help (although the actual string is implementor-defined I assume the paragraph may be in there [GnuCOBOL for example has the format: program-id; paragraph [or paragraph OF section or section, depending on your program]; source-line]).
If your COBOL compiler provides this information in this function and there is no exception in the offending part already: create one via subtract 1 from unsigned-var or similar.
As Bill already said (or implied): this is a question where the actual COBOL compiler used will be the most important part if you must have the names in as identifier and as label or not.
Edit (after the actual COBOL compiler is known):
IBM MVS Enterprise COBOL doesn't have the EXCEPTION-LOCATION function. Therefore I see only one built-in solution:
DECLARATIVES.
debug-declaratives SECTION.
USE FOR DEBUGGING ON ALL PROCEDURES.
debug-par.
MOVE debug-name TO current-procedure.
END DECLARATIVES.
But as this is only active if your program runs in debugging-mode (which may causes a lot of debugging messages to occur) I don't suggest to actual use this.
Try to use an Editor providing macros (or run a shell script on your actual source) to create the source you pass to the compiler afterwards.

How stanford-nlp distinguishes between abbreviation dot and full stop?

in this link http://nlp.stanford.edu/software/tokenizer.html
a document is processed and all abbreviation dot and full stop are recognized differently. I want to know the logic or process used behind this. Please explain.
You can split your document to sentences (using Stanford or any other tool, e.g this); clearly the dots at the end of sentences are full stops.

Max size for PO file strings

I know that PO / MO files are meant to be used for small strings like button names, labels, etc. Not long text like an About page, etc.
But lately I am encountering a lot of situations that are in the middle. For example, a two sentence call to action. Or a short paragraph.
Is there best practice or "rule of thumb" for when a string is too long to put in a PO file?
update
For "long" text I use partials and include the correct language version. My question is WHEN is it optimal to use one vs the other. I've heard that PO files are "inefficient" for "long" pieces of text. But what does that mean and when is it too "long"? Or is this not a concern?
Use one entry for a self-contained chunk of text; e.g. a sentence as you say.
Two sentences that belong together and don't make sense without each other should be one entry. Why? Because otherwise the translator wouldn't have the context necessary to translate it well. Same goes for a short paragraph, e.g. explaining a setting: if it's inseparable in the code, it should be one entry.
If you encounter a situation where you have lots of long texts regularly (e.g. entire pages or paragraphs of pages), that's usually a sign that you are using an ill-fitting tool. Some people do it, using Gettext for entire articles, but you're better off having separate documents in such cases. But that doesn't seem to be the case here.

Resources