(def
  (ident fn)
  (decl
    (list
      (param
        (ident x)
        (option)
        (option)
        (False))
      (param
        (ident y)
        (option)
        (option)
        (False))
      (param
        (ident z)
        (option)
        (option)
        (False)))
    (option))
  (list
    (assign
      (list (variable (ident q)))
      (option (None))
      (option))
    (assign
      (list (variable (ident q)))
      (option
        (-
          (+
            (variable (ident x))
            (variable (ident y)))
          (apply
            (.
              (variable (ident z))
              (ident sigmoid))
            (list)
            (list))))
      (option))
    (expression statement
      (apply
        (variable (ident print))
        (list (variable (ident q)))
        (list)))
    (assign
      (list (variable (ident w)))
      (option
        (unary minus
          (variable (ident z))))
      (option))
    (if
      (and
        (and
          (not (variable (ident x)))
          (not (variable (ident y))))
        (variable (ident z)))
      (list
        (assign
          (list (variable (ident m)))
          (option
            (if
              (not
                (variable (ident z)))
              (variable (ident x))
              (variable (ident y))))
          (option)))
      (list))
    (while
      (and
        (<
          (variable (ident x))
          (variable (ident y)))
        (>
          (variable (ident y))
          (variable (ident z))))
      (list
        (assign
          (list (variable (ident q)))
          (option (variable (ident x)))
          (option))))
    (assert
      (eq (const 1) (const 1))
      (option (string_literal hello)))
    (return (variable (ident x)))))
