Up to Main Index Up to Journal for August, 2023 JOURNAL FOR TUESDAY 8TH AUGUST, 2023 ______________________________________________________________________________ SUBJECT: If… DATE: Tue 8 Aug 20:35:46 BST 2023 Since Sunday’s release of Mere v0.0.4 I’ve been focusing my attention on ‘if’ statements. At the moment the ‘if’ statement is very basic: if condition; expression/statement When the condition is true then the following expression or statement is then executed. This has served Mere well. However, I think now is a good time to introduce a more expressive ‘if’. Ironically, this change will break a lot of Mere code. One of my main reasons for creating Mere was to have a language that others didn’t keep breaking for me all the time :( Still, alpha quality… I’ve been experimenting with the following structure for ‘if’ statements: if condition code block elseif condition // optional elseif code block : : // as many elseif as you need… : : else // optional else code block endif As a rule I don’t clock watch and usually only vaguely know what time it is. I even wrote many versions of a fuzzy clock. Here is a working[1] Mere version: >cat fuzzy-clock.mr hours = []string "twelve" "one" "two" "three" "four" "five", "six" "seven" "eight" "nine" "ten" "eleven" now = time hour, minute >< now\hour, now\minute if minute > 37; hour++; endif if 0 <= minute && minute <= 1 text = "%s o'clock" elseif 2 <= minute && minute <= 7 text = "Just gone %s o'clock" elseif 8 <= minute && minute <= 13 text = "Nearly quarter past %s" elseif 14 <= minute && minute <= 16 text = "Quarter past %s" elseif 17 <= minute && minute <= 22 text = "Just gone quarter past %s" elseif 23 <= minute && minute <= 28 text = "Nearly half past %s" elseif 29 <= minute && minute <= 31 text = "Half past %s" elseif 32 <= minute && minute <= 37 text = "Just gone half past %s" elseif 38 <= minute && minute <= 43 text = "Nearly quarter to %s" elseif 44 <= minute && minute <= 46 text = "Quarter to %s" elseif 47 <= minute && minute <= 52 text = "Just gone quarter to %s" elseif 53 <= minute && minute <= 58 text = "Nearly %s o'clock" else text = "%s o'clock" endif println printf text+"\n", hours[hour % 12] println >mere fuzzy-clock.mr Just gone half past eight >date Tue 8 Aug 20:34:02 BST 2023 > It’s all working, as are complex nested ‘if’ statements. But, I do really miss the ‘if’ short form :( if minute > 37; hour++ // old short form if minute > 37; hour++; endif // new short form if minute > 37 // new expanded form hour++ endif I’m thinking of adding a ‘when’ statement to replace the ‘if’ short form: when minute > 37; hour++ It’s short and reads well, I quite like it. I’m just conscious of the fact I’m taking away another useful variable name. The short ‘if’ could be kept as-is by adding a ‘then’ keyword after the ‘if’ and ‘elseif’ conditionals: if condition then code block elseif condition then // optional elseif code block : : // as many elseif as you need… : : else // optional else code block endif Many languages take this approach and it would avoid breakage in existing Mere code. However, I take one look at that and think “Nope… hate it…” :( The question mark could be used. In languages that support it, the question mark is often used for the ternary conditional operator. For example: condition ? <when true> : <when false> // typical ternary conditional condition ? <when true> // possible sort if form? There are some other decisions I need to make. Do we want ‘elseif’ and ‘endif’ or would shorter ‘elif’ and ‘fi’ be more desirable? Comparing this to other languages: elseif Dylan, Eiffel, MatLab, Modula 2, Oz, PHP, Tcl, VimScript endif PHP, VimScript elif Bourne Shell, Maple, Python fi Beta, Bourne Shell, Maple If you enjoy these topics see also “Conditional”[2] and “Dangling else”[3]. At the moment ‘elseif’ and ‘endif’ work. But, I’m leaning more towards: when condition; expression / statement if condition code block elif condition // optional elif code block : : // as many elif as you need… : : else // optional else code block fi On a different topic, I’m thinking of dropping subroutines now that functions are working. Subroutines are another feature that got Mere to where it is but have outlived their usefulness :( So, if you fancy yourself a bit of a programming language designer, or just have strong preferences, email me your thoughts: diddymus@wolfmud.org I did notice Go 1.21.0 was released a little earlier today. What fun! I already know I’ll have to fix Mere ICE due to incompatible WASM changes :( -- Diddymus [1] Only works with my development version of Mere… [2] Wikipedia, Conditional (computer programming): https://en.wikipedia.org/wiki/Conditional_(computer_programming) [3] Wikipedia, Dangling else: https://en.wikipedia.org/wiki/Dangling_else Up to Main Index Up to Journal for August, 2023