小编Nex*_*Nex的帖子

有没有办法返回对函数中创建的变量的引用?

我想编写一个程序,分两步编写一个文件.在程序运行之前,该文件可能不存在.文件名是固定的.

问题是OpenOptions.new().write()可能会失败.在这种情况下,我想调用自定义函数trycreate().我们的想法是创建文件而不是打开它并返回一个句柄.由于文件名是固定的,trycreate()没有参数,我不能设置返回值的生命周期.

我该如何解决这个问题?

use std::io::Write;
use std::fs::OpenOptions;
use std::path::Path;

fn trycreate() -> &OpenOptions {
    let f = OpenOptions::new().write(true).open("foo.txt");
    let mut f = match f {
        Ok(file)  => file,
        Err(_)  => panic!("ERR"),
    };
    f
}

fn main() {
    {
        let f = OpenOptions::new().write(true).open(b"foo.txt");
        let mut f = match f {
            Ok(file)  => file,
            Err(_)  => trycreate("foo.txt"),
        };
        let buf = b"test1\n";
        let _ret = f.write(buf).unwrap();
    }
    println!("50%");
    {
        let f = OpenOptions::new().append(true).open("foo.txt");
        let mut f …
Run Code Online (Sandbox Code Playgroud)

reference lifetime rust

31
推荐指数
4
解决办法
1万
查看次数

如何防止lisp宏中的表单评估?

我正在尝试创建一个简单的备忘录.如何防止在此代码中评估args表单?

(defmacro defun/memo (name args &rest body)
  `(let ((memo (make-hash-table :test 'equalp)))
     (defun ,name ,args
       (if (gethash (loop for x in ,args collect x) memo)
           (gethash (loop for x in ,args collect x) memo)
           (let ((result (progn ,@body)))
             (setf (gethash (loop for x in ,args collect x) memo) result)
             result)))))
Run Code Online (Sandbox Code Playgroud)

错误:

; in: DEFUN ADD
;     (X Y)
; 
; caught STYLE-WARNING:
;   undefined function: X
; 
; compilation unit finished
;   Undefined function:
;     X
Run Code Online (Sandbox Code Playgroud)

lisp macros evaluation common-lisp quoting

3
推荐指数
1
解决办法
153
查看次数

常见的 lisp 哈希表

任务是读取像“name phone”这样的N个字符串并存入。然后通过像“name”这样的请求找到存储的数据。我的代码将名称和数字存储在哈希表中,但之后找不到任何值。使用 maphash 检查存储值(它显示所有键值对)。

函数被一个空格分割只是实用程序。

(defparameter data (make-hash-table))

(defun split-by-one-space (string) ; to split string: "aaa bbb" -> (aaa bbb)
    (loop for i = 0 then (1+ j)
          as j = (position #\Space string :start i)
          collect (subseq string i j)
          while j))

(dotimes (i (read)) ; input data
    (let* ((inp (read-line))
           (raw (split-by-one-space inp))
           (name (string (car raw)))
           (phone (cadr raw)))
         (format t "Adding: ~W ~W~%" name phone) ; debug
         (setf (gethash name data) phone)))
(maphash #'(lambda (k v) …
Run Code Online (Sandbox Code Playgroud)

hashtable common-lisp

2
推荐指数
1
解决办法
887
查看次数