Advertisement
tinyevil

Untitled

Mar 20th, 2018
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. Require Import String.
  2. Require Import Ascii.
  3. Require Import ZArith.
  4. Load Base10.
  5. Open Scope Z.
  6. Open Scope string.
  7.  
  8. Inductive PrintDirective :=
  9. | FormatLit : ascii -> PrintDirective
  10. | FormatNum : PrintDirective
  11. | FormatString : PrintDirective
  12. | FormatChar : PrintDirective.
  13.  
  14. Definition PrintFormat := list PrintDirective.
  15.  
  16. Definition directiveType (dir : PrintDirective) :=
  17. match dir with
  18. | FormatLit _ => None
  19. | FormatNum => Some Z
  20. | FormatString => Some string
  21. | FormatChar => Some ascii
  22. end.
  23.  
  24. Fixpoint formatType (f : PrintFormat) : Set :=
  25. match f with
  26. | nil => string
  27. | cons dir dirs =>
  28. match directiveType dir with
  29. | Some T => T -> formatType dirs
  30. | None => formatType dirs
  31. end
  32. end.
  33.  
  34. Fixpoint sprintf (f : PrintFormat) (k:string->string) : formatType f :=
  35. match f with
  36. | nil => k EmptyString
  37. | cons dir dirs =>
  38. match dir with
  39. | FormatLit c => sprintf dirs (fun rest => k (String c rest))
  40. | FormatNum => fun z => sprintf dirs (fun rest => k (z_to_str z ++ rest))
  41. | FormatString => fun s => sprintf dirs (fun rest => k (s ++ rest))
  42. | FormatChar => fun c => sprintf dirs (fun rest => k (String c rest))
  43. end
  44. end.
  45.  
  46. Fixpoint parse_format (fmt:string) : PrintFormat :=
  47. match fmt with
  48. | String "%" (String "s" xs) => cons FormatString (parse_format xs)
  49. | String "%" (String "d" xs) => cons FormatNum (parse_format xs)
  50. | String "%" (String "c" xs) => cons FormatChar (parse_format xs)
  51. | String x xs => cons (FormatLit x) (parse_format xs)
  52. | EmptyString => nil
  53. end.
  54.  
  55. Definition printf (fmt:string) := sprintf (parse_format fmt) (fun s=>s).
  56.  
  57. Eval cbv in (
  58. printf "number is %d, character is %c, name is %s"
  59. 12
  60. ("Z"%char)
  61. "meduzik"
  62. : string).
  63.  
  64. Fail Eval cbv in (
  65. printf "number is %d, expected a number here: %d, character is %c, name is %s"
  66. 12
  67. ("Z"%char)
  68. "meduzik"
  69. : string).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement