Emitting warnings

Sometimes things go wrong. When things go wrong, we should report an error to our users. But how can one emit a warning from inside an evaluator?

Warnings in Mathics3 can be specified via the messages class field. The messages class field is a dictionary whose keys are the names of possible warning messages and whose values are template warning messages. For example, we may want to display a warning when our users pass something other than a string to Hello:

from typing import Optional
from mathics.builtin.base import Builtin, String
from mathics.core.evaluation import Evaluation

class Hello(Builtin):
  """
  <dl>
    <dt>Hello[$person$]
    <dd>An example function in a Python-importable Mathics3 module.
  </dl>
  >> Hello["World"]
   = Hello, World!
  """

  messages = {
    'nstr': '`1` is not a string',
  }

  def eval(self, person: String, evaluation: Evaluation) -> Optional[String]:
    "Hello[person_]"

    if not person.has_form('String'):
      return evaluation.message('Hello', 'nstr', person)

    return String(f"Hello, {person.value}!")

In this case, calling Hello[45] will emit the warning nstr: 45 is not a string.