It is often useful to control the memory layout of fields in a data structure to match an interface control definition, or to interface with hardware. Define a data structure matching the RS-232 Plug Definition. Use the 9-pin definition for brevity.

Pin Settings for Plug
(Reverse order for socket.)
__________________________________________
1  2  3  4  5  6  7  8  9  10 11 12 13
 14 15 16 17 18 19 20 21 22 23 24 25
_________________
1  2  3  4  5
6  7  8  9
25 pin                        9 pin
1 - PG   Protective ground
2 - TD   Transmitted data     3
3 - RD   Received data        2
4 - RTS  Request to send      7
5 - CTS  Clear to send        8
6 - DSR  Data set ready       6
7 - SG   Signal ground        5
8 - CD   Carrier detect       1
9 - + voltage (testing)
10 - - voltage (testing)
11 -
12 - SCD  Secondary CD
13 - SCS  Secondary CTS
14 - STD  Secondary TD
15 - TC   Transmit clock
16 - SRD  Secondary RD
17 - RC   Receiver clock
18 -
19 - SRS  Secondary RTS            
20 - DTR  Data terminal ready      4
21 - SQD  Signal quality detector
22 - RI   Ring indicator           9
23 - DRS  Data rate select
24 - XTC  External clock
25 -

import "/seq" for Lst
import "/fmt" for Fmt
 
var ON  = true
var OFF = false
 
// Converts "ON"/"OFF" string to true/false.
var AsBool = Fn.new { |s| s == "ON" }
 
class RS232_9 {
    static names { ["CD", "RD", "TD", "DTR", "SG", "DSR", "RTS", "CTS", "RI"] }
 
    construct new() { _settings = [OFF] * 9 } // all pins OFF
 
    // get pin setting as an ON/OFF string by pin name or number; returns null if invalid
    [p] {
        if (p is String) {
            var ix = Lst.indexOf(RS232_9.names, p)
            return (ix >= 0 && ix < 9) ? (_settings[ix] ? "ON" : "OFF") : null
        }
        if (p is Num) {
            return (p.isInteger && p >= 1 && p <= 9) ? (_settings[p-1] ? "ON" : "OFF") : null
        }
        return null
    }
 
    // set pin by pin name or number; does nothing if invalid
    [p] = (v) {
        if (v.type == String && (v == "ON" || v == "OFF")) v = AsBool.call(v)
        if (v.type != Bool) return
        if (p is String) {
            var ix = Lst.indexOf(RS232_9.names, p)
            if (ix >= 0 && ix < 9) _settings[ix] = v
        }
        if (p is Num && p.isInteger && p >= 1 && p <= 9) _settings[p-1] = v
    }
 
    // prints all pin settings
    toString { (1..9).map { |i| "%(i) %(Fmt.s(-3, RS232_9.names[i-1])) = %(this[i])" }.join("\n") }
}
 
var plug = RS232_9.new()
plug["CD"]  = ON      // set pin 1 by name
plug[3]     = ON      // set pin 3 by number
plug["DSR"] = "ON"    // set pin 6 by name and using a string
System.print(plug)    // print the state of the pins