Home   Archive   Permalink



print function

Regarding the two script functions below:
I don't understand why trying to substitute 'print RPPS-REC' in the RPPS-UNSTRING-RECORD for the 'x: copy[]' shown always throws an error saying that 'print' has no value argument.
I can replace 'x: copy[]' with an 'alert msg' and that also works. I 'am' giving print an argument...the name of the record I want printed. If I move the 'print RPPS-REC' request back up into the RPPS-READ function it gives the same error ???
    
RPPS-READ: does [
     RPPS-REC-COUNT: RPPS-REC-COUNT + 1
     RPPS-REC: copy ''
     RPPS-CURRENT-TYPE: copy ''
     RPPS-REC: pick RPPS-FILE RPPS-REC-COUNT    
     if none? RPPS-REC [
         RPPS-EOF: true
     ]
     if not RPPS-EOF [
         RPPS-UNSTRING-RECORD
     ]
]
RPPS-UNSTRING-RECORD: does [
     x: copy[]
]

posted by:   John Dutcher     13-Jan-2016/9:24:58-8:00



Well, I guess I better try to answer that question since I wrote that function.
    
That module (or probably a variation of it since the one on rebol.org probably was generalized for public viewing) is in production use here every day. Just now, I copied it, plus the program that uses it, to a test area and put in "print RPPS-REC" in RPPS-UNSTRING-RECORD and...it works fine for me.    
    
Is it possible that you did what I did recently, and elsewhere in your program used the "print" function, and spaced out and put a colon after the word "print"? That would redefine the "print" function and you never would find it because your eyes would pass over that colon.    
    
If that RPPS module is of use to you, I would be happy to email you the working version from our site, There is nothing classified in it and I have checked in the past to see if giving it away is legal, and it is. Or I could paste it into a reply here; it is about 328 lines long.    
    
It is a bit of a shock to see that someone noticed something I did, especially regarding REBOL which seems to have a couple hundred followers on the entire planet.

posted by:   Steven White     13-Jan-2016/10:30:18-8:00



I was looking for a well done way to read a flat file and ultimately manipulate its records' content. Your script looked perfect and ran first time right out of the box.....I added a "while" loop to actually read the records which seems to work. But no, I haven't redefined the "print" function, and I am astounded how you could duplicate my "print RPPs-REC" and not get an error. Yes....if it works for you ....you could paste it into a reply and I would grab it. You see...... the original.....as I copied it from the script example site had no "while loop" to do the reading of the file, just a series of "does" functions (very nice ones I thought). But my "while" loop works fine (while not RPPS-EOF), I just can't get the records being read to present themselves.

posted by:   John Dutcher     13-Jan-2016/10:41:44-8:00



I wonder if it's relevant that the file I happen to be reading is an HTML file (index.html, not index.txt). Maybe it cycles thru the records but what the pick is putting into RPPS-REC is ...like 'none' or something.....so print says I have no argument ?

posted by:   John Dutcher     13-Jan-2016/10:52:14-8:00



OK, let's give this a try.    
    
I notice that the RPPS module uses another function to pick apart its fixed-format records, so I will paste that in first. This RPPS module probably is not written in a REBOL-approved manner. It also was written for a very specific use.    
    
Function to extract a substring of a larger string:
    
GLB-SUBSTRING: func [
     "Return a substring from the start position to the end position"
     INPUT-STRING [series!] "Full input string"
     START-POS    [number!] "Starting position of substring"
     END-POS     [number!] "Ending position of substring"
] [
     if END-POS = -1 [END-POS: length? INPUT-STRING]
     return skip (copy/part INPUT-STRING END-POS) (START-POS - 1)
]
    
RPPS module as currently in production use:
    
TITLE
Remote Payment and Presentation System
    
SUMMARY
This module defines a file used for reporting money sent to us
electronically by the bank. The format is the same as a NACHA
file, but the fields might be used a little differently.
    
DOCUMENTATION
Since one normally would not write to this file (it is sent to us by the
bank), the procedures provided are for reading.
    
The procedures mimic COBOL usage.
    
Before using the file, call this procedure:
    
RPPS-OPEN-INPUT
This will bring the entire file into memory. If you don't like the default
file name, change it in RPPS-FILE-ID.
    
To "read" a record, do this until RPPS-EOF is true:
    
RPPS-READ
    
This will bring the next record into RPPS-REC and pick it apart into its
data items, putting each item into the words shown below, depending on
RPPS-CURRENT-TYPE.
    
SCRIPT
R E B O L [
]
    
;; [---------------------------------------------------------------------------]
;; [ This module defines a text file in the RPPS format for                    ]
;; [ getting money electronically from the bank.                             ]
;; [ RPPS stands for Remote Payment and Presentment System.                    ]
;; [ This is a "modified NACHA" format and is not quite the same             ]
;; [ as the file that WE send TO the bank for autopay.                         ]
;; [---------------------------------------------------------------------------]
    
RPPS-FILE: []                 ;; Holds the whole file in memory
RPPS-FILE-ID: %ACH.txt        ;; Default name of the file
RPPS-EOF: false             ;; End-of-file flag for reading
RPPS-REC: ""                 ;; One record, for reading or writing
RPPS-REC-COUNT: 0             ;; Counter, upped by 1 as we read or write
    
RPPS-CURRENT-TYPE: ""         ;; Type code of record in memory
    
;; [---------------------------------------------------------------------------]
;; [ When we read a record, we will take it apart in to its                    ]
;; [ fields and store the fields below. The CURRENT-TYPE field                ]
;; [ indicates which record we currently have our hands on.                    ]
;; [ For those record that contain numbers or amounts, some of the             ]
;; [ numbers or amounts are converted to appropriate data types                ]
;; [ so they can be used in appropriate ways (currency, for example).         ]
;; [---------------------------------------------------------------------------]
    
RPPS-1-RECORD-TYPE-CODE: ""
RPPS-1-PRIORITY-CODE: ""
RPPS-1-IMMEDIATE-DESTINATION: ""
RPPS-1-IMMEDIATE-ORIGIN: ""
RPPS-1-TRANSMISSION-DATE: ""
RPPS-1-TRANSMISSION-TIME: ""
RPPS-1-FILE-ID-MODIFIER: ""
RPPS-1-RECORD-SIZE: ""
RPPS-1-BLOCKING-FACTOR: ""
RPPS-1-FORMAT-CODE: ""
RPPS-1-DESTINATION-NAME: ""
RPPS-1-ORIGIN: ""
RPPS-1-REFERENCE-CODE: ""
    
RPPS-5-RECORD-TYPE-CODE: ""
RPPS-5-SERVICE-CLASS-CODE: ""
RPPS-5-BILLER-NAME: ""
RPPS-5-RESERVED: ""
RPPS-5-BILLER-ID-NUMBER: ""
RPPS-5-ENTRY-CLASS: ""
RPPS-5-ENTRY-DESCRIPTION: ""
RPPS-5-DESCRIPTIVE-DATE: ""
RPPS-5-EFFECTIVE-DATE: ""
RPPS-5-SETTLEMENT-DATE: ""
RPPS-5-CONCENTRATOR-STATUS: ""
RPPS-5-RPPS-ID-NUMBER: ""
RPPS-5-BATCH-NUMBER: ""
    
RPPS-5-EFFECTIVE-DATE-E: ""
    
RPPS-6-RECORD-TYPE-CODE: ""
RPPS-6-TRANSACTION-CODE: ""
RPPS-6-RPPS-ID-NUMBER: ""
RPPS-6-MERCHANT-ACCOUNT-NBR: ""
RPPS-6-AMOUNT: ""
RPPS-6-CONSUMER-ACCOUNT-NBR: ""
RPPS-6-CONSUMER-NAME: ""
RPPS-6-RPPS-FLAG: ""
RPPS-6-ADDENDUM-RECORD-IND: ""
RPPS-6-TRACE-NUMBER: ""
RPPS-6-SEQUENCE-NUMBER: ""
    
RPPS-6-AMOUNT-N: ""
    
RPPS-8-RECORD-TYPE-CODE: ""
RPPS-8-SERVICE-CLASS-CODE: ""
RPPS-8-ENTRY-ADDENDA-COUNT: ""
RPPS-8-ENTRY-HASH: ""
RPPS-8-TOTAL-DEBIT: ""
RPPS-8-TOTAL-CREDIT: ""
RPPS-8-BILLER-ID-NUMBER: ""
RPPS-8-MAC: ""
RPPS-8-FILLER-1: ""
RPPS-8-RPPS-ID-NUMBER: ""
RPPS-8-BATCH-NUMBER: ""
    
RPPS-8-TOTAL-DEBIT-N: ""
RPPS-8-TOTAL-CREDIT-N: ""
    
RPPS-9-RECORD-TYPE-CODE: ""
RPPS-9-BATCH-COUNT: ""
RPPS-9-BLOCK-COUNT: ""
RPPS-9-ENTRY-ADDENDA-COUNT: ""
RPPS-9-ENTRY-HASH: ""
RPPS-9-TOTAL-DEBIT: ""
RPPS-9-TOTAL-CREDIT: ""
RPPS-9-FILLER-1: ""
    
RPPS-OPEN-INPUT: does [
     RPPS-FILE: copy []
     RPPS-FILE: read/lines RPPS-FILE-ID
     RPPS-EOF: false
     RPPS-REC-COUNT: 0
     remove-each TEST-STRING RPPS-FILE [= GLB-SUBSTRING TEST-STRING 1 10 "9999999999"]
]
    
RPPS-READ: does [
     RPPS-REC-COUNT: RPPS-REC-COUNT + 1
     RPPS-REC: copy ""
     RPPS-CURRENT-TYPE: copy ""
     RPPS-REC: pick RPPS-FILE RPPS-REC-COUNT    
     if none? RPPS-REC [
         RPPS-EOF: true
     ]
     if not RPPS-EOF [
         RPPS-UNSTRING-RECORD
     ]
]
    
RPPS-CLOSE-INPUT: does [
     RPPS-FILE: copy []
     RPPS-REC: copy ""
]
    
RPPS-OPEN-OUTPUT: does [
     RPPS-FILE: copy []
     RPPS-REC: copy ""
     RPPS-REC-COUNT: 0
]
    
RPPS-WRITE: does [
     append RPPS-FILE RPPS-REC
     RPPS-REC-COUNT: RPPS-REC-COUNT + 1
]
    
RPPS-CLOSE-OUTPUT: does [
     write/lines RPPS-FILE-ID RPPS-FILE
     RPPS-FILE: copy []
     RPPS-REC: copy ""
]
    
RPPS-UNSTRING-RECORD: does [
     RPPS-CURRENT-TYPE: GLB-SUBSTRING RPPS-REC 1 1
     if RPPS-CURRENT-TYPE = "1" [
         RPPS-UNSTRING-1
     ]
     if RPPS-CURRENT-TYPE = "5" [
         RPPS-UNSTRING-5
     ]
     if RPPS-CURRENT-TYPE = "6" [
         RPPS-UNSTRING-6
     ]
     if RPPS-CURRENT-TYPE = "8" [
         RPPS-UNSTRING-8
     ]
     if RPPS-CURRENT-TYPE = "9" [
         RPPS-UNSTRING-9
     ]
]
    
RPPS-UNSTRING-1: does [
     RPPS-1-RECORD-TYPE-CODE: copy ""
     RPPS-1-PRIORITY-CODE: copy ""
     RPPS-1-IMMEDIATE-DESTINATION: copy ""
     RPPS-1-IMMEDIATE-ORIGIN: copy ""
     RPPS-1-TRANSMISSION-DATE: copy ""
     RPPS-1-TRANSMISSION-TIME: copy ""
     RPPS-1-FILE-ID-MODIFIER: copy ""
     RPPS-1-RECORD-SIZE: copy ""
     RPPS-1-BLOCKING-FACTOR: copy ""
     RPPS-1-FORMAT-CODE: copy ""
     RPPS-1-DESTINATION-NAME: copy ""
     RPPS-1-ORIGIN: copy ""
     RPPS-1-REFERENCE-CODE: copy ""
     RPPS-1-RECORD-TYPE-CODE: GLB-SUBSTRING RPPS-REC 1 1
     RPPS-1-PRIORITY-CODE: GLB-SUBSTRING RPPS-REC 2 3
     RPPS-1-IMMEDIATE-DESTINATION: GLB-SUBSTRING RPPS-REC 4 13
     RPPS-1-IMMEDIATE-ORIGIN: GLB-SUBSTRING RPPS-REC 14 23
     RPPS-1-TRANSMISSION-DATE: GLB-SUBSTRING RPPS-REC 24 29
     RPPS-1-TRANSMISSION-TIME: GLB-SUBSTRING RPPS-REC 30 33
     RPPS-1-FILE-ID-MODIFIER: GLB-SUBSTRING RPPS-REC 34 34
     RPPS-1-RECORD-SIZE: GLB-SUBSTRING RPPS-REC 35 37
     RPPS-1-BLOCKING-FACTOR: GLB-SUBSTRING RPPS-REC 38 39
     RPPS-1-FORMAT-CODE: GLB-SUBSTRING RPPS-REC 40 40
     RPPS-1-DESTINATION-NAME: GLB-SUBSTRING RPPS-REC 41 63
     RPPS-1-ORIGIN: GLB-SUBSTRING RPPS-REC 64 86
     RPPS-1-REFERENCE-CODE: GLB-SUBSTRING RPPS-REC 87 94
]
    
RPPS-UNSTRING-5: does [
     RPPS-5-RECORD-TYPE-CODE: copy ""
     RPPS-5-SERVICE-CLASS-CODE: copy ""
     RPPS-5-BILLER-NAME: copy ""
     RPPS-5-RESERVED: copy ""
     RPPS-5-BILLER-ID-NUMBER: copy ""
     RPPS-5-ENTRY-CLASS: copy ""
     RPPS-5-ENTRY-DESCRIPTION: copy ""
     RPPS-5-DESCRIPTIVE-DATE: copy ""
     RPPS-5-EFFECTIVE-DATE: copy ""
     RPPS-5-SETTLEMENT-DATE: copy ""
     RPPS-5-CONCENTRATOR-STATUS: copy ""
     RPPS-5-RPPS-ID-NUMBER: copy ""
     RPPS-5-BATCH-NUMBER: copy ""
     RPPS-5-RECORD-TYPE-CODE: GLB-SUBSTRING RPPS-REC 1 1
     RPPS-5-SERVICE-CLASS-CODE: GLB-SUBSTRING RPPS-REC 2 4
     RPPS-5-BILLER-NAME: GLB-SUBSTRING RPPS-REC 5 20
     RPPS-5-RESERVED: GLB-SUBSTRING RPPS-REC 21 40
     RPPS-5-BILLER-ID-NUMBER: GLB-SUBSTRING RPPS-REC 41 50
     RPPS-5-ENTRY-CLASS: GLB-SUBSTRING RPPS-REC 51 53
     RPPS-5-ENTRY-DESCRIPTION: GLB-SUBSTRING RPPS-REC 54 63
     RPPS-5-DESCRIPTIVE-DATE: GLB-SUBSTRING RPPS-REC 64 69
     RPPS-5-EFFECTIVE-DATE: GLB-SUBSTRING RPPS-REC 70 75
     RPPS-5-SETTLEMENT-DATE: GLB-SUBSTRING RPPS-REC 76 78
     RPPS-5-CONCENTRATOR-STATUS: GLB-SUBSTRING RPPS-REC 79 79
     RPPS-5-ID-NUMBER: GLB-SUBSTRING RPPS-REC 80 87
     RPPS-5-BATCH-NUMBER: GLB-SUBSTRING RPPS-REC 88 94
     RPPS-5-EFFECTIVE-DATE-E: rejoin [
         GLB-SUBSTRING RPPS-5-EFFECTIVE-DATE 3 4
         "/"
         GLB-SUBSTRING RPPS-5-EFFECTIVE-DATE 5 6
         "/"
         "20"
         GLB-SUBSTRING RPPS-5-EFFECTIVE-DATE 1 2
     ]
]
    
RPPS-UNSTRING-6: does [
     RPPS-6-RECORD-TYPE-CODE: copy ""
     RPPS-6-TRANSACTION-CODE: copy ""
     RPPS-6-RPPS-ID-NUMBER: copy ""
     RPPS-6-MERCHANT-ACCOUNT-NBR: copy ""
     RPPS-6-AMOUNT: copy ""
     RPPS-6-CONSUMER-ACCOUNT-NBR: copy ""
     RPPS-6-CONSUMER-NAME: copy ""
     RPPS-6-RPPS-FLAG: copy ""
     RPPS-6-ADDENDUM-RECORD-IND: copy ""
     RPPS-6-TRACE-NUMBER: copy ""
     RPPS-6-SEQUENCE-NUMBER: copy ""
     RPPS-6-RECORD-TYPE-CODE: GLB-SUBSTRING RPPS-REC 1 1
     RPPS-6-TRANSACTION-CODE: GLB-SUBSTRING RPPS-REC 2 3
     RPPS-6-RPPS-ID-NUMBER: GLB-SUBSTRING RPPS-REC 4 12
     RPPS-6-MERCHANT-ACCOUNT-NBR: GLB-SUBSTRING RPPS-REC 13 29
     RPPS-6-AMOUNT: GLB-SUBSTRING RPPS-REC 30 39
     RPPS-6-CONSUMER-ACCOUNT-NBR: GLB-SUBSTRING RPPS-REC 40 54
     RPPS-6-CONSUMER-NAME: GLB-SUBSTRING RPPS-REC 55 76
     RPPS-6-RPPS-FLAG: GLB-SUBSTRING RPPS-REC 77 78
     RPPS-6-ADDENDUM-RECORD-IND: GLB-SUBSTRING RPPS-REC 79 79
     RPPS-6-TRACE-NUMBER: GLB-SUBSTRING RPPS-REC 80 87
     RPPS-6-SEQUENCE-NUMBER: GLB-SUBSTRING RPPS-REC 88 94
     RPPS-6-AMOUNT-N: to-decimal divide to-decimal RPPS-6-AMOUNT 100
]
    
RPPS-UNSTRING-8: does [
     RPPS-8-RECORD-TYPE-CODE: copy ""
     RPPS-8-SERVICE-CLASS-CODE: copy ""
     RPPS-8-ENTRY-ADDENDA-COUNT: copy ""
     RPPS-8-ENTRY-HASH: copy ""
     RPPS-8-TOTAL-DEBIT: copy ""
     RPPS-8-TOTAL-CREDIT: copy ""
     RPPS-8-BILLER-ID-NUMBER: copy ""
     RPPT-8-MAC: copy ""
     RPPS-8-FILLER-1: copy ""
     RPPS-8-RPPS-ID-NUMBER: copy ""
     RPPS-8-BATCH-NUMBER: copy ""
     RPPS-8-RECORD-TYPE-CODE: GLB-SUBSTRING RPPS-REC 1 1
     RPPS-8-SERVICE-CLASS-CODE: GLB-SUBSTRING RPPS-REC 2 4
     RPPS-8-ENTRY-ADDENDA-COUNT: GLB-SUBSTRING RPPS-REC 5 10
     RPPS-8-ENTRY-HASH: GLB-SUBSTRING RPPS-REC 11 20
     RPPS-8-TOTAL-DEBIT: GLB-SUBSTRING RPPS-REC 21 32
     RPPS-8-TOTAL-CREDIT: GLB-SUBSTRING RPPS-REC 33 44
     RPPS-8-BILLER-ID-NUMBER: GLB-SUBSTRING RPPS-REC 45 54
     RPPS-8-MAC: GLB-SUBSTRING RPPS-REC 55 73
     RPPS-8-FILLER-1: GLB-SUBSTRING RPPS-REC 74 79
     RPPS-8-RPPS-ID-NUMBER: GLB-SUBSTRING RPPS-REC 80 87
     RPPS-8-BATCH-NUMBER: GLB-SUBSTRING RPPS-REC 88 94
     RPPS-8-TOTAL-DEBIT-N: divide to-decimal RPPS-8-TOTAL-DEBIT 100
     RPPS-8-TOTAL-CREDIT-N: divide to-decimal RPPS-8-TOTAL-CREDIT 100    
]
    
RPPS-UNSTRING-9: does [
     RPPS-9-RECORD-TYPE-CODE: copy ""
     RPPS-9-BATCH-COUNT: copy ""
     RPPS-9-BLOCK-COUNT: copy ""
     RPPS-9-ENTRY-ADDENDA-COUNT: copy ""
     RPPS-9-ENTRY-HASH: copy ""
     RPPS-9-TOTAL-DEBIT: copy ""
     RPPS-9-TOTAL-CREDIT: copy ""
     RPPS-9-FILLER-1: copy ""
     RPPS-9-RECORD-TYPE-CODE: GLB-SUBSTRING RPPS-REC 1 1
     RPPS-9-BATCH-COUNT: GLB-SUBSTRING RPPS-REC 2 7
     RPPS-9-BLOCK-COUNT: GLB-SUBSTRING RPPS-REC 8 13
     RPPS-9-ENTRY-ADDENDA-COUNT: GLB-SUBSTRING RPPS-REC 14 21
     RPPS-9-ENTRY-HASH: GLB-SUBSTRING RPPS-REC 22 31
     RPPS-9-TOTAL-DEBIT: GLB-SUBSTRING RPPS-REC 32 43
     RPPS-9-TOTAL-CREDIT: GLB-SUBSTRING RPPS-REC 44 55
     RPPS-9-FILLER-1: GLB-SUBSTRING RPPS-REC 56 94
]
    
;; -----------------------------------------------------------------------------
    
    


posted by:   Steven White     13-Jan-2016/11:49:48-8:00



By the way, the program that uses the RPPS module uses it in a rather COBOL-like way, for various reasons not relevant at this time. In COBOL, there are a couple ways of structuring a loop to read through a file. You can read a record at the beginning of the loop and check for end-of-file at that point, and then NOT proceed if you are at the end, OR, you can do an initial read BEFORE you enter the loop and then read the next record at the END of the loop, as shown below:
    
;; -- Extract all detail records.
RPPS-READ                                        ;; Get first bank record
while [not RPPS-EOF] [                         ;; Process until end of file
     if = RPPS-CURRENT-TYPE "6" [EXTRACT-THIS-PAYMENT]
     RPPS-READ
]
    
You might have a point of confusion in that area.
    


posted by:   Steven White     13-Jan-2016/12:03:46-8:00



Yee ha......problem solved in an unexpected way (to me) !! I had previously added to your original script at the bottom this code:
    
do RPPS-OPEN-INPUT    
do RPPS-READ
while [not RPPS-EOF][    
     do RPPS-READ
]
alert "End of File"
    
Once I saw your own version of the 'while' loop....I noticed that using the "do" as a way to call the other functions is not correct apparently. Once I removed them and my code now looks like this:
    
RPPS-OPEN-INPUT    
RPPS-READ
while [not RPPS-EOF][    
     RPPS-READ
]
alert "End of File"    
    
The print function call works fine and displays the records exactly !!!
    
Thanks much.......so I guess you don't think
Rebol 3 or Red are gonna set the world on fire now that they are open sourced ??    

posted by:   John Dutcher     13-Jan-2016/13:30:49-8:00



I am not qualified to have a valid opinion about REBOL 3 or Red. But looking at Linux, where there is some person "in charge" and a lot of people working on it, a couple items come to mind about REBOL and Red. For REBOL, it has been released "into the wild" as open source, but it seems more like Carl has "washed his hands" of it and REBOL now is sort on its own without any direction. I worry that without any leader, nothing will come of it. For Red, it seems like a vastly ambitious project run by one, but only one, very smart guy. I worry that he won't be able to pull it off, not because he isn't qualified, but because he is only one person. And as for REBOL 2, I worry that since it not supported, the time will come when we will get Windows 11, 12,13...nn, and REBOL 2 will quit working. Where I work, REBOL 2 can't be sold as a solution to anything because of its lack of support and because everyone is in love with Microsoft.    
    
So I worry that REBOL will be like the Amiga, Control Data, Burroughs. Genius...lost.

posted by:   Steven White     13-Jan-2016/14:02:46-8:00