{"id":11049,"date":"2025-07-10T01:09:00","date_gmt":"2025-07-10T05:09:00","guid":{"rendered":"https:\/\/www.both.org\/?p=11049"},"modified":"2025-07-09T13:11:42","modified_gmt":"2025-07-09T17:11:42","slug":"a-small-algol-68-project-part-1","status":"publish","type":"post","link":"https:\/\/www.both.org\/?p=11049","title":{"rendered":"A Small Algol 68 Project, Part 1"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"\" data-post-id=\"11049\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div>\n<p><em>In memory of J. Kevin Douglas, a good friend and fellow fan of Algol 68<\/em><\/p>\n\n\n\n<p>In the <a href=\"https:\/\/www.both.org\/?p=11010\">last article in this series<\/a>, we looked at our first simple Algol 68 program:<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-fe9cc265 wp-block-group-is-layout-flex\">\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp; &nbsp; BEGIN<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp; &nbsp; &nbsp; &nbsp; first random(42);<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; REAL sum of randoms := 0.0;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp; &nbsp; &nbsp; &nbsp; WHILE sum of randoms &lt; 10.0 DO&nbsp;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; REAL r := next random;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum of randoms +:= r;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print((\"random number = \",r,\"; sum = \",sum of randoms,new line))<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp; &nbsp; &nbsp; &nbsp; OD<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp; &nbsp; END<\/code><\/p>\n<\/div>\n\n\n\n<p>As we&nbsp; reviewed the program line-by-line to understand its meaning, we learned some Algol 68 terminology to describe what is going on in those nine lines of code.<\/p>\n\n\n\n<p>And, I know I said \u201c<em>In the next article, we\u2019ll dig into a few of the less obvious but still important details that make this all work.&nbsp; Then we can move on to see some more cool things that we can do in Algol 68<\/em>\u201d, but I\u2019m going to postpone that until we have some more useful code examples developed.<\/p>\n\n\n\n<p>Because in the end, this little program is about as&nbsp; interesting a demo of Algol 68 as a \u201cHello World\u201d.&nbsp; Let\u2019s&nbsp; do something a bit more useful for now.<\/p>\n\n\n\n<p>I think it\u2019s fair to say that Algol 68 reflects some of the interests of computer scientists of the 1960s.&nbsp; In particular, with its interest in handling arrays and looping, we can see the interest in numerical computation.&nbsp; So why not look at a simple approximation problem through the Algol 68 lens?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Vectors, matrices and least squares estimation<\/strong><\/h2>\n\n\n\n<p>A common problem to solve for anyone handling data in the real world is using least squares estimation to produce a \u201cbest fit\u201d of an equation to a set of data.&nbsp; Of course, in 2025, we can use a special purpose language like R or numerical statistics libraries called from general purpose languages like C&nbsp; or Java to solve this kind of problem; but for really simple problems, it\u2019s kind of cool to know how to \u201cdo it yourself\u201d.<\/p>\n\n\n<p>[pmath size=12]S(f)(t)=a_{0}+sum{n=1}{+infty}{a_{n} cos(n omega t)+b_{n} sin(n omega t)}[\/pmath]<\/p>\n\n\n\n<p>Let\u2019s imagine we have a text file in CSV format, with two columns containing <em>x<\/em> and <em>y<\/em> values, and we want to fit those values with a straight line so that we minimize the error of approximating the point values with the straight line.<\/p>\n\n\n\n<p>We know the equation of a line is:<\/p>\n\n\n\n<p><em>y = m \u00b7 x + b<\/em><\/p>\n\n\n\n<p>where <em>m<\/em> is the slope of the line and <em>b<\/em> is the y-intercept.<\/p>\n\n\n\n<p>If there are only two points in our CSV file, we know we can fit a line to them exactly.&nbsp; However, if there are three or more points, then we need to choose values for <em>m<\/em> and <em>b<\/em> to \u201cbest fit\u201d those <em>x<\/em> and <em>y<\/em> values.&nbsp; If we rewrite the above equation slightly as:<\/p>\n\n\n\n<p><em>m \u00b7 x + b \u00b7 1 = y<\/em><\/p>\n\n\n\n<p>That is, <em>m<\/em> is the coefficient of <em>x<\/em>, <em>b<\/em> the coefficient of 1 (I know that might sound a bit weird but bear with me here).<\/p>\n\n\n\n<p>And we think of our CSV file as having n+1 lines, looking like:<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-fe9cc265 wp-block-group-is-layout-flex\">\n<p><code>X-value,Y-value<\/code><\/p>\n\n\n\n<p><code>x<sub>1<\/sub>,y<sub>1<\/sub><\/code><\/p>\n\n\n\n<p><code>x<sub>2<\/sub>,y<sub>2<\/sub><\/code><\/p>\n\n\n\n<p><code>x<sub>3<\/sub>,y<sub>3<\/sub><\/code><\/p>\n\n\n\n<p><code>\u2026<\/code><\/p>\n\n\n\n<p><code>x<sub>n<\/sub>,y<sub>n<\/sub><\/code><\/p>\n<\/div>\n\n\n\n<p>then we can see that this leads to a system of linear equations that looks like:<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-fe9cc265 wp-block-group-is-layout-flex\">\n<p><em>m \u00b7 x<sub>1<\/sub> + b \u00b7 <\/em>1 =<em> y<sub>1<\/sub><\/em><\/p>\n\n\n\n<p><em>m \u00b7 x<sub>2<\/sub> + b \u00b7 <\/em>1 = <em>y<sub>2<\/sub><\/em><\/p>\n\n\n\n<p><em>m \u00b7 x3 + b \u00b7 <\/em>1 = <em>y<sub>3<\/sub><\/em><\/p>\n\n\n\n<p>\u2026<\/p>\n\n\n\n<p><em>m \u00b7 x<sub>n<\/sub> + b \u00b7 <\/em>1 = <em>y<sub>n<\/sub><\/em><\/p>\n<\/div>\n\n\n\n<p>which we can write in matrix form as<\/p>\n\n\n\n<p><em>X <\/em><u>c<\/u> = <u>y<\/u><\/p>\n\n\n\n<p>where <em>X<\/em> is the matrix:<\/p>\n\n\n\n<table style=\"width: 90px;padding: 2px\">\n  <col width=\"3\" \/>\n  <col width=\"40\" \/>\n  <col width=\"40\" \/>\n  <col width=\"3\" \/>\n  <tr>\n    <td width=\"3\" style=\"border-top: 1px solid #000000;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0.05cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>x<sub>1<\/sub><\/em>\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      1\n    <\/td>\n    <td width=\"3\" style=\"border-top: 1px solid #000000;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0.05cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>x<sub>2<\/sub><\/em>\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      1\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>x<sub>3<\/sub><\/em>\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      1\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td colspan=\"2\" width=\"110\" style=\"text-align: center;border: none;padding: 0cm\">\n      &#8230;\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: 1px solid #000000;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0.05cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>x<sub>n<\/sub><\/em>\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      1\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: 1px solid #000000;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0.05cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n<\/table>\n\n\n\n<p><em><u>c<\/u><\/em> is the vector of coefficients we\u2019re solving for:<\/p>\n\n\n\n<table style=\"width: 50px;padding: 2px\">\n  <col width=\"3\" \/>\n  <col width=\"40\" \/>\n  <col width=\"3\" \/>\n  <tr>\n    <td width=\"3\" style=\"border-top: 1px solid #000000;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0.05cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>m<\/em>\n    <\/td>\n    <td width=\"3\" style=\"border-top: 1px solid #000000;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0.05cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: 1px solid #000000;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0.05cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>c<\/em>\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: 1px solid #000000;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0.05cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n<\/table>\n\n\n\n<p>and <em><u>y<\/u><\/em> is the vector:<\/p>\n\n\n\n<table style=\"width: 50px;padding 2px\">\n  <col width=\"3\" \/>\n  <col width=\"40\" \/>\n  <col width=\"3\" \/>\n  <tr>\n    <td width=\"3\" style=\"border-top: 1px solid #000000;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0.05cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>y<sub>1<\/sub><\/em>\n    <\/td>\n    <td width=\"3\" style=\"border-top: 1px solid #000000;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0.05cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>y<sub>2<\/sub><\/em>\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>y<sub>3<\/sub><\/em>\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      &#8230;\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: none;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n  <tr>\n    <td width=\"3\" style=\"border-top: none;border-bottom: 1px solid #000000;border-left: 1px solid #000000;border-right: none;padding-top: 0cm;padding-bottom: 0.05cm;padding-left: 0.05cm;padding-right: 0cm\">\n    <\/td>\n    <td width=\"40\" style=\"text-align: center;border: none;padding: 0cm\">\n      <em>y<sub>n<\/sub><\/em>\n    <\/td>\n    <td width=\"3\" style=\"border-top: none;border-bottom: 1px solid #000000;border-left: none;border-right: 1px solid #000000;padding-top: 0cm;padding-bottom: 0.05cm;padding-left: 0cm;padding-right: 0.05cm\">\n    <\/td>\n  <\/tr>\n<\/table>\n\n\n\n<p>You remember this from your high school or undergrad linear algebra course, right? The hard part is done, now I just have to wave my hands a bit and tell you that:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>This is what is called an \u201coverdetermined\u201d system of equations;<\/li>\n\n\n\n<li>We can solve this problem in a least squares fashion by premultiplying both sides of the equation by the transpose of the matrix <em>X<\/em>, which we denote as <em>X<sup>T<\/sup><\/em><\/li>\n<\/ol>\n\n\n\n<p>That is,<\/p>\n\n\n\n<p><em>X<sup>T<\/sup> X <u>c<\/u> = X<sup>T<\/sup> <u>y<\/u><\/em><\/p>\n\n\n\n<p>What this means is that, by forming the products of <em>X<sup>T<\/sup>X <\/em>and&nbsp; <em>X<sup>T<\/sup><u>y<\/u><\/em>, we will end up with a two-rows by two-columns matrix and a two-row vector respectively, with which we can solve for the two-row vector <u>c<\/u>.<\/p>\n\n\n\n<p>Good so far?&nbsp; Awesome, let\u2019s plan the tasks we need to handle.&nbsp; I should mention that <a href=\"https:\/\/global.oup.com\/booksites\/content\/0199268010\/samplesec3\">this excellent article from Oxford University Press<\/a> will dispel the hand-waving used in my explanation above.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Steps to solve the linear least squares matrix formulation<\/strong><\/h2>\n\n\n\n<p>We need t the following:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A test data set;<\/li>\n\n\n\n<li>Some utilities to let us read CSV files;<\/li>\n\n\n\n<li>The least squares approximation program that reads the CSV file, calculates <em>X<\/em><em>T<\/em><em>X<\/em> and&nbsp; <em>X<\/em><em>T<\/em><em>y<\/em> and solves for c<\/li>\n<\/ol>\n\n\n\n<p>We\u2019ll finish up this article by writing a test data set generator.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Test data generator<\/strong><\/h2>\n\n\n\n<p>Recall the equation of a line given previously:<\/p>\n\n\n\n<p><em>y = m \u00b7 x + b<\/em><\/p>\n\n\n\n<p>Let\u2019s create a set of points that lie along the line that joins x = 0, y = 1 with x = 9, y = 10.&nbsp; This corresponds to a specific line with the equation:<\/p>\n\n\n\n<p><em>y = x + <\/em>1<\/p>\n\n\n\n<p>Furthermore, let\u2019s use the random number generator described in the last article and shown at the top of this article to add a small random offset to the y value in our generated points.&nbsp; With enough points, we intuitively feel that the least squares fit to the points should give values to m and b similar to the above.<\/p>\n\n\n\n<p>Here\u2019s the code:<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-fe9cc265 wp-block-group-is-layout-flex\">\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp; &nbsp; BEGIN<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp; &nbsp; &nbsp; &nbsp; first random(42);<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp; &nbsp; &nbsp; &nbsp; REAL x1 = 0.0, y1 = 1.0, x2 = 9.0, delta = 1.0 \/ 64;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp; &nbsp; &nbsp; &nbsp; REAL x := x1, y := y1;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp; &nbsp; &nbsp; &nbsp; print((\"X-value\", \",\", \"Y-value\", new line));<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp; &nbsp; &nbsp; &nbsp; WHILE x &lt;= x2 DO<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; REAL y adj = y + (next random - 0.5) \/ 8.0;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print((fixed(x,7,5), \",\", fixed(y adj,7,5), new line));<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x +:= delta;<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y +:= delta<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp; &nbsp; &nbsp; &nbsp; OD<\/code><\/p>\n\n\n\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp; &nbsp; END<\/code><\/p>\n<\/div>\n\n\n\n<p>We won\u2019t go through this line by line as there isn\u2019t much that is different than in the previous program.&nbsp; However:<\/p>\n\n\n\n<p>In line 3, we see the beginning x and y values and the end x value (we don\u2019t need the end y value as we\u2019re going to just test for x reaching the end), and a delta value, used to increment x and y, of 1\/64.&nbsp; These are all constants.<\/p>\n\n\n\n<p>In line 7 we see the y value being adjusted by the \u201cnext random\u201d value, which falls between 0 and 1, less -0.5, which then falls between -0.5 and +0.5, and finally divided by 8 so that the random adjustment is never greater than 1\/16 or less than -1\/16.&nbsp;<\/p>\n\n\n\n<p>We can run this with Algol 68 Genie in a Linux terminal window as:<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-fe9cc265 wp-block-group-is-layout-flex\">\n<p><kbd>$ a68g a2.a68<\/kbd><\/p>\n\n\n\n<p><kbd>X-value,Y-value<\/kbd><\/p>\n\n\n\n<p><kbd>+.00000,+.97022<\/kbd><\/p>\n\n\n\n<p><kbd>+.01562,+.95618<\/kbd><\/p>\n\n\n\n<p><kbd>+.03125,+1.0211<\/kbd><\/p>\n\n\n\n<p><kbd>\u2026<\/kbd><\/p>\n\n\n\n<p><kbd>+8.9688,+9.9956<\/kbd><\/p>\n\n\n\n<p><kbd>+8.9844,+10.012<\/kbd><\/p>\n\n\n\n<p><kbd>+9.0000,+10.057<\/kbd><\/p>\n\n\n\n<p><kbd>$<\/kbd><\/p>\n<\/div>\n\n\n\n<p>Of course, we\u2019ll want to redirect this to a file such as \u201ctest_data.txt\u201d.<\/p>\n\n\n\n<p>In the next article, we\u2019ll work on a few useful utilities to handle CSV files.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In memory of J. Kevin Douglas, a good friend and fellow fan of Algol 68 In the last<\/p>\n","protected":false},"author":430,"featured_media":2725,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[5,150],"tags":[783],"class_list":["post-11049","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-programming","tag-algol-68"],"modified_by":"David Both","_links":{"self":[{"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts\/11049","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/users\/430"}],"replies":[{"embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11049"}],"version-history":[{"count":8,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts\/11049\/revisions"}],"predecessor-version":[{"id":11109,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/posts\/11049\/revisions\/11109"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=\/wp\/v2\/media\/2725"}],"wp:attachment":[{"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11049"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11049"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.both.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11049"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}