Skip to content

Conversation

@ed9w2in6
Copy link

In an org file, the src block's code should be interpreted, OR the binary compiled from it SHOULD execute with PWD as default-directory of the org file.

Summary of changes:

  1. save the original default-directory then later restores it.
  2. supply --manifest-path option to cargo run to execute the target Cargo.toml binary compiled from the src block.

For reference:
Try to execute a C++, C, js (node), python block.
In particular, see implementation of org-babel-C-execute or org-babel-python-evaluate-external-process.
May be we can re-write like them in the future.

fixes: #509

In an org file, the src block's code should be interpreted, OR the binary compiled from it SHOULD execute with PWD as `default-directory` of the org file.

Summary of changes: 
1. save the original default-directory then later restores it.
2. supply `--manifest-path` option to `cargo run` to execute the target `Cargo.toml` binary compiled from the src block.

For reference:
Try to execute a C++, C, js (node), python block.
In particular, see implementation of `org-babel-C-execute` or `org-babel-python-evaluate-external-process`.  May be we can re-write like them in the future.

fixes: brotzeit#509
@ed9w2in6
Copy link
Author

The 2 code block should yield identical outputs when executed in a src block of a org file.

Rust

use std::env;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    for f in fs::read_dir(".")? {
        let fpath = f?.path();
        let fname = fpath.to_str().expect("Path should convert to str");
        println!("{fname}");
    }
    Ok(())
}

C++

#include <string.h>
#include <dirent.h>
#include <stdio.h>

using namespace std;

int main() {
DIR *dir;
struct dirent *dp;

dir = opendir(".");
while ((dp = readdir(dir)) != NULL) {
  // printf("debug: %s\n", dp->d_name);
  if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") ) {
    // do nothing (straight logic)
  } else {
    printf("./%s\n", dp->d_name);
  }
}
closedir(dir);
return 0;
return 0;
}

Here is a sample org file for your reference.

Sample Org File
#+TITLE:Loop Do Nothing
* Components
** foobar
   #+begin_src rustic :results output scalar :eval yes :main no
use std::env;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    for f in fs::read_dir(".")? {
        let fpath = f?.path();
        let fname = fpath.to_str().expect("Path should convert to str");
        println!("{fname}");
    }
    Ok(())
}
   #+end_src

#+begin_src C++ :results scalar :eval yes :includes <string.h> <dirent.h> <stdio.h> :namespaces std
DIR *dir;
struct dirent *dp;

dir = opendir(".");
while ((dp = readdir(dir)) != NULL) {
  // printf("debug: %s\n", dp->d_name);
  if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") ) {
    // do nothing (straight logic)
  } else {
    printf("./%s\n", dp->d_name);
  }
}
closedir(dir);
return 0;
#+end_src

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Directory that binary executed from

1 participant