mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 20:10:13 +01:00
Note, to see the results, here's a [README
link](https://github.com/carbon-language/carbon-lang/blob/654a06e0af7886dc43f52d35f4d11f32c5e8da9d/README.md)
(note this is for the 654a06e commit)
Enumerating changes:
- Finish the work started in #3735 by updating the images.
- Reverts changes to vector initialization style made in #3735, instead
preferring https://abseil.io/tips/88 style
- Switch array syntax to match [#syntax
discussion](https://discord.com/channels/655572317891461132/709488742942900284/1219410082719207444)
- Some nuanced highlighting changes to try matching what I'm seeing in
GitHub.
- The original intent was to match GitHub's highlighting, at least for
C++; Carbon highlighting is expected to be poor because it's not a
supported language.
2.5 KiB
2.5 KiB
Front page snippets for Carbon
Images
Images are managed in Google Drive.
Quicksort
A sample of quicksort in Carbon.
package Sorting;
fn Partition[T:! Comparable & Movable](s: Slice(T))
-> i64 {
var i: i64 = -1;
for (e: T in s) {
if (e <= s.Last()) {
++i;
Swap(&s[i], &e);
}
}
return i;
}
fn QuickSort[T:! Comparable & Movable](s: Slice(T)) {
if (s.Size() <= 1) {
return;
}
let p: i64 = Partition(s);
QuickSort(s[:p - 1]);
QuickSort(s[p + 1:]);
}
Carbon and C++
C++
// C++:
#include <numbers>
#include <print>
#include <span>
#include <stdfloat>
#include <vector>
// or: import std;
struct Circle {
std::float32_t r;
};
void PrintTotalArea(std::span<Circle> circles) {
std::float32_t area = 0;
for (const Circle& c : circles) {
area += std::numbers::pi * c.r * c.r;
}
std::print("Total area: {}\n", area);
}
auto main() -> int {
std::vector<Circle> circles = {{.r = 1.0}, {.r = 2.0}};
// Implicitly converts `vector` to `span`.
PrintTotalArea(circles);
return 0;
}
Carbon
// Carbon:
package Geometry;
import Math;
class Circle {
var r: f32;
}
fn PrintTotalArea(circles: [Circle]) {
var area: f32 = 0;
for (c: Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
fn Main() -> i32 {
// A dynamically sized array, like `std::vector`.
var circles: array [Circle] = ({.r = 1.0}, {.r = 2.0});
// Implicitly constructs a slice from the array.
PrintTotalArea(circles);
return 0;
}
Mixed
// C++ code used in both Carbon and C++:
#include <stdfloat>
struct Circle {
std::float32_t r;
};
// Carbon exposing a function for C++:
package Geometry;
import Cpp library "circle.h";
import Math;
fn PrintTotalArea(circles: [Cpp.Circle]) {
var area: f32 = 0;
for (c: Cpp.Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
// C++ calling Carbon:
#include <vector>
#include "circle.h"
#include "geometry.carbon.h"
auto main() -> int {
std::vector<Circle> circles = {{1.0}, {2.0}};
// A Carbon slice supports implicit construction
// from `std::vector`, similar to `std::span`.
Geometry::PrintTotalArea(circles);
return 0;
}