(defvar lpp-mode-hook nil)

(defvar lpp-mode-map
  (let ((map (make-keymap)))
    (define-key map (kbd "C-\\") (lambda () (interactive) (insert "\\")))
    (define-key map (kbd "\\") "λ")
    map)
  "Keymap for LPP major mode")

(defun lpp-indent-line ()) ; todo

(defconst lpp--token-syntax-types
  '((
     ("#.*" . font-lock-comment-face)
     ("$\\w*" . font-lock-variable-name-face)
     ("λ\\w*" . font-lock-builtin-face)
     )nil nil nil))

(defconst lpp--syntax-table
  (let ((table (make-syntax-table)))
    (modify-syntax-entry ?\/  "<" table)
    (modify-syntax-entry ?\n  ">" table)
    table)
  "Syntax table for lpp-mode.")

;;;###autoload
(defgroup lpp nil
  "Major mode for editing λ++ code."
  :prefix 'lpp
  :group 'languages)

;;;###autoload
(define-derived-mode lpp-mode prog-mode "lpp"
  "Major mode for editing λ++ source code."
  :syntax-table lpp--syntax-table
  :group 'lpp
  (setq-local font-lock-defaults lpp--token-syntax-types)
  (use-local-map lpp-mode-map)
  (set (make-local-variable 'indent-line-function) 'lpp-indent-line)  
  (run-hooks 'lpp-mode-hook))

;;;###autoload
(add-to-list 'auto-mode-alist '("\\.lpp\\'" . lpp-mode))
;;;###autoload
(add-to-list 'interpreter-mode-alist '("lpp" . lpp-mode))
(provide 'lpp-mode)