Directories in Chapel

Here’s the translation of the Go code to Chapel, formatted in Markdown suitable for Hugo:

Chapel provides several useful functions for working with directories in the file system.

use FileSystem;
use Path;
use IO;

// Helper function to check for errors
proc check(err: Error?) {
  if err != nil {
    halt(err);
  }
}

// Helper function to create a new empty file
proc createEmptyFile(name: string) {
  var f = open(name, iomode.cw);
  f.close();
}

// Main function
proc main() {
  // Create a new sub-directory in the current working directory
  mkdir("subdir", mode=0o755);

  // When creating temporary directories, it's good practice to remove them afterwards
  defer {
    rmTree("subdir");
  }

  createEmptyFile("subdir/file1");

  // We can create a hierarchy of directories, including parents
  mkdir("subdir/parent/child", parents=true, mode=0o755);

  createEmptyFile("subdir/parent/file2");
  createEmptyFile("subdir/parent/file3");
  createEmptyFile("subdir/parent/child/file4");

  // listDir lists directory contents
  writeln("Listing subdir/parent");
  for entry in listDir("subdir/parent") {
    var isDir = isDir(entry);
    writeln(" ", entry, " ", isDir);
  }

  // chdir lets us change the current working directory
  chdir("subdir/parent/child");

  // Now we'll see the contents of subdir/parent/child when listing the current directory
  writeln("Listing subdir/parent/child");
  for entry in listDir(".") {
    var isDir = isDir(entry);
    writeln(" ", entry, " ", isDir);
  }

  // Change back to where we started
  chdir("../../..");

  // We can also visit a directory recursively, including all its sub-directories
  writeln("Visiting subdir");
  walkdirHelper("subdir");
}

// walkdirHelper is called for every file or directory found recursively
proc walkdirHelper(dir: string) {
  for entry in walkdirRec(dir) {
    var path = entry[1];
    var isDir = isDir(path);
    writeln(" ", path, " ", isDir);
  }
}

To run the program, save it as directories.chpl and use the Chapel compiler:

$ chpl directories.chpl -o directories
$ ./directories
Listing subdir/parent
 child true
 file2 false
 file3 false
Listing subdir/parent/child
 file4 false
Visiting subdir
 subdir true
 subdir/file1 false
 subdir/parent true
 subdir/parent/child true
 subdir/parent/child/file4 false
 subdir/parent/file2 false
 subdir/parent/file3 false

This Chapel code demonstrates various operations on directories, including creating directories, listing contents, changing the current working directory, and recursively walking through a directory structure.

Note that Chapel uses modules like FileSystem, Path, and IO to provide functionality similar to Go’s os and filepath packages. The defer statement in Chapel serves a similar purpose to Go’s defer, ensuring cleanup operations are performed.

Chapel’s walkdirRec function is used instead of Go’s filepath.WalkDir, providing similar recursive directory traversal functionality. The isDir function is used to check if an entry is a directory, similar to the IsDir() method in Go.

Remember that while the concepts are similar, the exact behavior and performance characteristics may differ between Go and Chapel.