diff --git a/lib/pinc_backend/Pinc_Interpreter.ml b/lib/pinc_backend/Pinc_Interpreter.ml index 9ff9a20..45c64c2 100644 --- a/lib/pinc_backend/Pinc_Interpreter.ml +++ b/lib/pinc_backend/Pinc_Interpreter.ml @@ -16,8 +16,8 @@ module Value = struct let of_bool ~value_loc b = { value_loc; value_desc = Bool b } let of_int ~value_loc i = { value_loc; value_desc = Int i } let of_float ~value_loc f = { value_loc; value_desc = Float f } - let of_vector ~value_loc l = { value_loc; value_desc = Array l } - let of_list ~value_loc l = { value_loc; value_desc = Array (Vector.of_list l) } + let of_array ~value_loc l = { value_loc; value_desc = Array l } + let of_list ~value_loc l = { value_loc; value_desc = Array (Array.of_list l) } let of_string_map ~value_loc m = { value_loc; value_desc = Record m } let make_component ~render ~tag ~attributes = @@ -48,7 +48,7 @@ module Value = struct | Array l -> let buf = Buffer.create 200 in l - |> Vector.iteri ~f:(fun i it -> + |> Array.iteri (fun i it -> if i <> 0 then Buffer.add_char buf '\n'; Buffer.add_string buf (to_string it)); @@ -119,7 +119,8 @@ module Value = struct | DefinitionInfo (_name, Some _, _negated) -> true | DefinitionInfo (_name, None, _negated) -> false | Function _ -> true - | Array v -> not (Vector.is_empty v) + | Array [||] -> false + | Array _ -> true | Record m -> not (StringMap.is_empty m) | TagInfo _ -> assert false ;; @@ -133,7 +134,7 @@ module Value = struct | Float a, Int b -> a = float_of_int b | Int a, Float b -> float_of_int a = b | Bool a, Bool b -> a = b - | Array a, Array b -> Vector.equal ~eq:(fun a b -> equal a b) a b + | Array a, Array b -> Array.combine a b |> Array.for_all (fun (a, b) -> equal a b) | Record a, Record b -> StringMap.equal (fun (_, a) (_, b) -> equal a b) a b | Function _, Function _ -> false | DefinitionInfo (a, _, _), DefinitionInfo (b, _, _) -> String.equal a b @@ -163,7 +164,7 @@ module Value = struct | Float a, Int b -> Float.compare a (float_of_int b) | Int a, Float b -> Float.compare (float_of_int a) b | Bool a, Bool b -> Bool.compare a b - | Array a, Array b -> Int.compare (Vector.length a) (Vector.length b) + | Array a, Array b -> Int.compare (Array.length a) (Array.length b) | Record a, Record b -> StringMap.compare compare a b | Null, Null -> 0 | ComponentTemplateNode _, ComponentTemplateNode _ -> 0 @@ -366,8 +367,8 @@ and eval_expression ~state expression = | Ast.Array l -> let output = l - |> Vector.map ~f:(fun it -> it |> eval_expression ~state |> State.get_output) - |> Value.of_vector ~value_loc:expression.expression_loc + |> Array.map (fun it -> it |> eval_expression ~state |> State.get_output) + |> Value.of_array ~value_loc:expression.expression_loc in state |> State.add_output ~output | Ast.Record map -> @@ -1062,7 +1063,7 @@ and eval_binary_bracket_access ~state left right = match (left_value.value_desc, right_value.value_desc) with | Array a, Int b -> let output = - try Vector.get_exn a b + try Array.get a b with Invalid_argument _ -> Value.null ~value_loc:(Location.merge ~s:left.expression_loc ~e:right.expression_loc ()) @@ -1115,18 +1116,20 @@ and eval_binary_bracket_access ~state left right = | _ -> Pinc_Diagnostics.error left.expression_loc - "Trying to access a property on a non record or array value." + (Printf.sprintf + "Trying to access a property on a non record or array value (%s)." + (Value.to_string left_value)) and eval_binary_array_add ~state left right = let left_value = left |> eval_expression ~state |> State.get_output in let right_value = right |> eval_expression ~state |> State.get_output in match (left_value.value_desc, right_value) with | Array l, value -> - let new_array = Vector.add_list l [ value ] in + let new_array = Array.append l [| value |] in state |> State.add_output ~output: - (Value.of_vector + (Value.of_array ~value_loc: (Location.merge ~s:left.expression_loc ~e:right.expression_loc ()) new_array) @@ -1141,9 +1144,9 @@ and eval_binary_merge ~state left_expression right_expression = let eval_merge left right = match (left.value_desc, right.value_desc) with | Array l, Array r -> - Value.of_vector + Value.of_array ~value_loc:(Location.merge ~s:left.value_loc ~e:right.value_loc ()) - (Vector.append l r) + (Array.append l r) | Record l, Record r -> Value.of_string_map ~value_loc:(Location.merge ~s:left.value_loc ~e:right.value_loc ()) @@ -1360,10 +1363,11 @@ and eval_for_in ~state ~index_ident ~ident ~reverse ~iterable body = match iterable_value.value_desc with | Array l -> let to_seq array = - if reverse then - array |> Vector.rev |> Vector.to_array |> Array.to_seq + if reverse then ( + array |> Array.stable_sort (fun _ _ -> 1); + array |> Array.to_seq) else - array |> Vector.to_array |> Array.to_seq + array |> Array.to_seq in let state, res = l |> to_seq |> loop ~state [] in state @@ -1436,7 +1440,7 @@ and eval_range ~state ~inclusive from_expression upto_expression = let from_int, upto_int = get_range from upto in let iter = if from_int > upto_int then - Vector.empty + [||] else ( let start = from_int in let stop = @@ -1445,16 +1449,15 @@ and eval_range ~state ~inclusive from_expression upto_expression = else upto_int in - Vector.make (stop - start) 0 - |> Vector.mapi ~f:(fun i _ -> - Value.of_int - ~value_loc:(Location.merge ~s:from.value_loc ~e:upto.value_loc ()) - (i + start))) + Array.init (stop - start) (fun i -> + Value.of_int + ~value_loc:(Location.merge ~s:from.value_loc ~e:upto.value_loc ()) + (i + start))) in state |> State.add_output ~output: - (Value.of_vector + (Value.of_array ~value_loc:(Location.merge ~s:from.value_loc ~e:upto.value_loc ()) iter) @@ -1481,7 +1484,7 @@ and eval_slot ~tag ~attributes ~slotted_elements key = v :: acc else acc - | { value_desc = Array l; _ } -> l |> Vector.fold ~f:keep_slotted ~x:acc + | { value_desc = Array l; _ } -> l |> Array.fold_left keep_slotted acc | { value_desc = String s; _ } when String.trim s = "" -> acc | { value_loc; _ } -> Pinc_Diagnostics.error @@ -1542,7 +1545,7 @@ and eval_slot ~tag ~attributes ~slotted_elements key = "slot contraints need to be an array of definitions which are either \ allowed or disallowed") |> Option.map - (Vector.map ~f:(function + (Array.map (function | { value_desc = DefinitionInfo (name, Some `Component, negated); _ } -> (`Component, name, negated) | { value_desc = DefinitionInfo (name, None, _negated); value_loc } -> @@ -1564,7 +1567,7 @@ and eval_slot ~tag ~attributes ~slotted_elements key = let check_instance_restriction tag = match constraints with | None -> Result.ok () - | Some v when Vector.is_empty v -> + | Some [||] -> Result.error (Printf.sprintf "Child with tag `%s` may not be used inside this #Slot. \n\ @@ -1575,7 +1578,7 @@ and eval_slot ~tag ~attributes ~slotted_elements key = let is_in_list = ref false in let allowed, disallowed = restrictions - |> Vector.to_list + |> Array.to_list |> List.partition_map (fun (_typ, name, negated) -> if name = tag then is_in_list := true; @@ -1595,7 +1598,7 @@ and eval_slot ~tag ~attributes ~slotted_elements key = else ( let contraints = constraints - |> Option.map Vector.to_list + |> Option.map Array.to_list |> Option.value ~default:[] |> List.map (fun (_typ, name, negated) -> if negated = `Negated then @@ -1691,14 +1694,14 @@ and eval_internal_tag ~state ~tag ~key ~attributes ~value_bag tag_identifier = (Printf.sprintf "Expected attribute %s to be an array." key)) |> Option.map (fun array -> array - |> Vector.mapi ~f:(fun index item -> + |> Array.mapi (fun index item -> let key = string_of_int index in { of' with key } |> eval_internal_or_external_tag ~state ~tag ~value:(StringMap.singleton key item)) - |> Value.of_vector ~value_loc:tag.Ast.tag_loc) + |> Value.of_array ~value_loc:tag.Ast.tag_loc) |> Option.value ~default:(Value.null ~value_loc:tag.tag_loc ()) | `Record -> let of' = diff --git a/lib/pinc_backend/Pinc_Interpreter_Types.ml b/lib/pinc_backend/Pinc_Interpreter_Types.ml index 7cbb02a..84e8141 100644 --- a/lib/pinc_backend/Pinc_Interpreter_Types.ml +++ b/lib/pinc_backend/Pinc_Interpreter_Types.ml @@ -1,5 +1,4 @@ module Ast = Pinc_Frontend.Ast -module Vector = CCRAL module rec Value : sig type value = { @@ -15,7 +14,7 @@ module rec Value : sig | Int of int | Float of float | Bool of bool - | Array of value Vector.t + | Array of value Array.t | Record of (int * value) StringMap.t | Function of function_info | DefinitionInfo of definition_info diff --git a/lib/pinc_backend/Pinc_Typer.ml b/lib/pinc_backend/Pinc_Typer.ml index 44edee3..2da8e27 100644 --- a/lib/pinc_backend/Pinc_Typer.ml +++ b/lib/pinc_backend/Pinc_Typer.ml @@ -115,7 +115,7 @@ module Expect = struct | Char _ -> Pinc_Diagnostics.(error Location.none "expected array, got char") | Float _ -> Pinc_Diagnostics.(error Location.none "expected array, got float") | Bool _ -> Pinc_Diagnostics.(error Location.none "expected array, bool") - | Array a -> Some (a |> Vector.map ~f:fn) + | Array a -> Some (a |> Array.map fn) | Record _ -> Pinc_Diagnostics.(error Location.none "expected array, got record") | Function _ -> Pinc_Diagnostics.(error Location.none "expected array, got function definition") diff --git a/lib/pinc_frontend/Pinc_Ast.ml b/lib/pinc_frontend/Pinc_Ast.ml index 0e5f649..cdacbd5 100644 --- a/lib/pinc_frontend/Pinc_Ast.ml +++ b/lib/pinc_frontend/Pinc_Ast.ml @@ -69,7 +69,7 @@ and expression_desc = | Int of int | Float of float | Bool of bool - | Array of expression CCRAL.t + | Array of expression array | Record of (int * bool * expression) StringMap.t (** order, nullable, value *) | Function of { parameters : string list; diff --git a/lib/pinc_frontend/Pinc_Parser.ml b/lib/pinc_frontend/Pinc_Parser.ml index 96e3231..8be0924 100644 --- a/lib/pinc_frontend/Pinc_Parser.ml +++ b/lib/pinc_frontend/Pinc_Parser.ml @@ -648,7 +648,7 @@ module Rules = struct next t; let expressions = Helpers.separated_list ~sep:Token.COMMA ~fn:parse_expression t - |> CCRAL.of_list + |> Array.of_list in expect Token.RIGHT_BRACK t; Ast.(Array expressions) |> Option.some diff --git a/test/array.t/data.pi b/test/array.t/data.pi index e973c7a..128cd28 100644 --- a/test/array.t/data.pi +++ b/test/array.t/data.pi @@ -76,4 +76,4 @@ component C { {[5, 1, 2, 3, 6, 3, 4, 7] |> Array.sort(fn (a, b) -> a - b)} -} \ No newline at end of file +} diff --git a/test/array.t/run.t b/test/array.t/run.t index b490add..467056a 100644 --- a/test/array.t/run.t +++ b/test/array.t/run.t @@ -1,1002 +1,107 @@ $ print . C - 1000 - 999 - 998 - 997 - 996 - 995 - 994 - 993 - 992 - 991 - 990 - 989 - 988 - 987 - 986 - 985 - 984 - 983 - 982 - 981 - 980 - 979 - 978 - 977 - 976 - 975 - 974 - 973 - 972 - 971 - 970 - 969 - 968 - 967 - 966 - 965 - 964 - 963 - 962 - 961 - 960 - 959 - 958 - 957 - 956 - 955 - 954 - 953 - 952 - 951 - 950 - 949 - 948 - 947 - 946 - 945 - 944 - 943 - 942 - 941 - 940 - 939 - 938 - 937 - 936 - 935 - 934 - 933 - 932 - 931 - 930 - 929 - 928 - 927 - 926 - 925 - 924 - 923 - 922 - 921 - 920 - 919 - 918 - 917 - 916 - 915 - 914 - 913 - 912 - 911 - 910 - 909 - 908 - 907 - 906 - 905 - 904 - 903 - 902 - 901 - 900 - 899 - 898 - 897 - 896 - 895 - 894 - 893 - 892 - 891 - 890 - 889 - 888 - 887 - 886 - 885 - 884 - 883 - 882 - 881 - 880 - 879 - 878 - 877 - 876 - 875 - 874 - 873 - 872 - 871 - 870 - 869 - 868 - 867 - 866 - 865 - 864 - 863 - 862 - 861 - 860 - 859 - 858 - 857 - 856 - 855 - 854 - 853 - 852 - 851 - 850 - 849 - 848 - 847 - 846 - 845 - 844 - 843 - 842 - 841 - 840 - 839 - 838 - 837 - 836 - 835 - 834 - 833 - 832 - 831 - 830 - 829 - 828 - 827 - 826 - 825 - 824 - 823 - 822 - 821 - 820 - 819 - 818 - 817 - 816 - 815 - 814 - 813 - 812 - 811 - 810 - 809 - 808 - 807 - 806 - 805 - 804 - 803 - 802 - 801 - 800 - 799 - 798 - 797 - 796 - 795 - 794 - 793 - 792 - 791 - 790 - 789 - 788 - 787 - 786 - 785 - 784 - 783 - 782 - 781 - 780 - 779 - 778 - 777 - 776 - 775 - 774 - 773 - 772 - 771 - 770 - 769 - 768 - 767 - 766 - 765 - 764 - 763 - 762 - 761 - 760 - 759 - 758 - 757 - 756 - 755 - 754 - 753 - 752 - 751 - 750 - 749 - 748 - 747 - 746 - 745 - 744 - 743 - 742 - 741 - 740 - 739 - 738 - 737 - 736 - 735 - 734 - 733 - 732 - 731 - 730 - 729 - 728 - 727 - 726 - 725 - 724 - 723 - 722 - 721 - 720 - 719 - 718 - 717 - 716 - 715 - 714 - 713 - 712 - 711 - 710 - 709 - 708 - 707 - 706 - 705 - 704 - 703 - 702 - 701 - 700 - 699 - 698 - 697 - 696 - 695 - 694 - 693 - 692 - 691 - 690 - 689 - 688 - 687 - 686 - 685 - 684 - 683 - 682 - 681 - 680 - 679 - 678 - 677 - 676 - 675 - 674 - 673 - 672 - 671 - 670 - 669 - 668 - 667 - 666 - 665 - 664 - 663 - 662 - 661 - 660 - 659 - 658 - 657 - 656 - 655 - 654 - 653 - 652 - 651 - 650 - 649 - 648 - 647 - 646 - 645 - 644 - 643 - 642 - 641 - 640 - 639 - 638 - 637 - 636 - 635 - 634 - 633 - 632 - 631 - 630 - 629 - 628 - 627 - 626 - 625 - 624 - 623 - 622 - 621 - 620 - 619 - 618 - 617 - 616 - 615 - 614 - 613 - 612 - 611 - 610 - 609 - 608 - 607 - 606 - 605 - 604 - 603 - 602 - 601 - 600 - 599 - 598 - 597 - 596 - 595 - 594 - 593 - 592 - 591 - 590 - 589 - 588 - 587 - 586 - 585 - 584 - 583 - 582 - 581 - 580 - 579 - 578 - 577 - 576 - 575 - 574 - 573 - 572 - 571 - 570 - 569 - 568 - 567 - 566 - 565 - 564 - 563 - 562 - 561 - 560 - 559 - 558 - 557 - 556 - 555 - 554 - 553 - 552 - 551 - 550 - 549 - 548 - 547 - 546 - 545 - 544 - 543 - 542 - 541 - 540 - 539 - 538 - 537 - 536 - 535 - 534 - 533 - 532 - 531 - 530 - 529 - 528 - 527 - 526 - 525 - 524 - 523 - 522 - 521 - 520 - 519 - 518 - 517 - 516 - 515 - 514 - 513 - 512 - 511 - 510 - 509 - 508 - 507 - 506 - 505 - 504 - 503 - 502 - 501 - 500 - 499 - 498 - 497 - 496 - 495 - 494 - 493 - 492 - 491 - 490 - 489 - 488 - 487 - 486 - 485 - 484 - 483 - 482 - 481 - 480 - 479 - 478 - 477 - 476 - 475 - 474 - 473 - 472 - 471 - 470 - 469 - 468 - 467 - 466 - 465 - 464 - 463 - 462 - 461 - 460 - 459 - 458 - 457 - 456 - 455 - 454 - 453 - 452 - 451 - 450 - 449 - 448 - 447 - 446 - 445 - 444 - 443 - 442 - 441 - 440 - 439 - 438 - 437 - 436 - 435 - 434 - 433 - 432 - 431 - 430 - 429 - 428 - 427 - 426 - 425 - 424 - 423 - 422 - 421 - 420 - 419 - 418 - 417 - 416 - 415 - 414 - 413 - 412 - 411 - 410 - 409 - 408 - 407 - 406 - 405 - 404 - 403 - 402 - 401 - 400 - 399 - 398 - 397 - 396 - 395 - 394 - 393 - 392 - 391 - 390 - 389 - 388 - 387 - 386 - 385 - 384 - 383 - 382 - 381 - 380 - 379 - 378 - 377 - 376 - 375 - 374 - 373 - 372 - 371 - 370 - 369 - 368 - 367 - 366 - 365 - 364 - 363 - 362 - 361 - 360 - 359 - 358 - 357 - 356 - 355 - 354 - 353 - 352 - 351 - 350 - 349 - 348 - 347 - 346 - 345 - 344 - 343 - 342 - 341 - 340 - 339 - 338 - 337 - 336 - 335 - 334 - 333 - 332 - 331 - 330 - 329 - 328 - 327 - 326 - 325 - 324 - 323 - 322 - 321 - 320 - 319 - 318 - 317 - 316 - 315 - 314 - 313 - 312 - 311 - 310 - 309 - 308 - 307 - 306 - 305 - 304 - 303 - 302 - 301 - 300 - 299 - 298 - 297 - 296 - 295 - 294 - 293 - 292 - 291 - 290 - 289 - 288 - 287 - 286 - 285 - 284 - 283 - 282 - 281 - 280 - 279 - 278 - 277 - 276 - 275 - 274 - 273 - 272 - 271 - 270 - 269 - 268 - 267 - 266 - 265 - 264 - 263 - 262 - 261 - 260 - 259 - 258 - 257 - 256 - 255 - 254 - 253 - 252 - 251 - 250 - 249 - 248 - 247 - 246 - 245 - 244 - 243 - 242 - 241 - 240 - 239 - 238 - 237 - 236 - 235 - 234 - 233 - 232 - 231 - 230 - 229 - 228 - 227 - 226 - 225 - 224 - 223 - 222 - 221 - 220 - 219 - 218 - 217 - 216 - 215 - 214 - 213 - 212 - 211 - 210 - 209 - 208 - 207 - 206 - 205 - 204 - 203 - 202 - 201 - 200 - 199 - 198 - 197 - 196 - 195 - 194 - 193 - 192 - 191 - 190 - 189 - 188 - 187 - 186 - 185 - 184 - 183 - 182 - 181 - 180 - 179 - 178 - 177 - 176 - 175 - 174 - 173 - 172 - 171 - 170 - 169 - 168 - 167 - 166 - 165 - 164 - 163 - 162 - 161 - 160 - 159 - 158 - 157 - 156 - 155 - 154 - 153 - 152 - 151 - 150 - 149 - 148 - 147 - 146 - 145 - 144 - 143 - 142 - 141 - 140 - 139 - 138 - 137 - 136 - 135 - 134 - 133 - 132 - 131 - 130 - 129 - 128 - 127 - 126 - 125 - 124 - 123 - 122 - 121 - 120 - 119 - 118 - 117 - 116 - 115 - 114 - 113 - 112 - 111 - 110 - 109 - 108 - 107 - 106 - 105 - 104 - 103 - 102 - 101 - 100 - 99 - 98 - 97 - 96 - 95 - 94 - 93 - 92 - 91 - 90 - 89 - 88 - 87 - 86 - 85 - 84 - 83 - 82 - 81 - 80 - 79 - 78 - 77 - 76 - 75 - 74 - 73 - 72 - 71 - 70 - 69 - 68 - 67 - 66 - 65 - 64 - 63 - 62 - 61 - 60 - 59 - 58 - 57 - 56 - 55 - 54 - 53 - 52 - 51 - 50 - 49 - 48 - 47 - 46 - 45 - 44 - 43 - 42 - 41 - 40 - 39 - 38 - 37 - 36 - 35 - 34 - 33 - 32 - 31 - 30 - 29 - 28 - 27 - 26 - 25 - 24 - 23 - 22 - 21 - 20 - 19 - 18 - 17 - 16 - 15 - 14 - 13 - 12 - 11 - 10 +
+ 0 + 1 + 2 + 3 + + 0 + 1 + 2 + 3 + 4 + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 9 + + 1 + 2 + 3 + + 1 + 3 8 - 7 + + + 8 + 8 + + 0 + 2 + 4 6 + 8 + + 1 + 3 5 + 7 + 9 + + 0 + 2 4 + 6 + 8 + + FOUND + + NOT FOUND + + true + true + false + false + 21 + + 0 + 1 + 2 3 + 4 + + 3 + 4 + 5 + 6 + 7 + +
1,2,3
+
4,5,6
+
7,8,9
+
10
+ + 1 2 - 1 - + 3 + 3 + 4 + 5 + 6 + 7 +