Skip to main content

The Craft of Emacs

Types, errors and control flow

30 minutes

Define the helper function xx--read-positive

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

xx--read-positive takes a single prompt argument

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

Get a number as input

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

Bind it to input

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

If the number is an integer

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

And it is greater than 0

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

Return the input

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

If not, print a helpful message

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)

Ask for a positive input again.

(defunxx--read-positive
(prompt)
(let
(
(input
(read-numberprompt)
)
)
(if
(and
(integerpinput)
(>input0)
)
input
(message"Enter an integer greater than 0.")
(sit-for1)
(xx--read-positiveprompt)
)
)
)