4 From: Bram Moolenaar <Bram@moolenaar.net>
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
11 Problem: MzScheme interface can't evaluate an expression.
12 Solution: Add mzeval(). (Sergey Khorev)
13 Files: runtime/doc/eval.txt, runtime/doc/if_mzsch.txt,
14 runtime/doc/usr_41.txt, src/eval.c, src/if_mzsch.c,
15 src/proto/eval.pro, src/proto/if_mzsch.pro,
16 src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
17 src/testdir/Makefile, src/testdir/main.aap, src/testdir/test1.in,
18 src/testdir/test70.in, src/testdir/test70.ok
21 *** ../vim-7.2.335/runtime/doc/eval.txt 2009-11-17 12:20:30.000000000 +0100
22 --- runtime/doc/eval.txt 2010-01-19 15:30:50.000000000 +0100
25 List match and submatches of {pat} in {expr}
26 matchstr( {expr}, {pat}[, {start}[, {count}]])
27 String {count}'th match of {pat} in {expr}
28 ! max({list}) Number maximum value of items in {list}
29 ! min({list}) Number minimum value of items in {list}
30 ! mkdir({name} [, {path} [, {prot}]])
31 Number create directory {name}
32 mode( [expr]) String current editing mode
33 nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum}
34 nr2char( {expr}) String single char with ASCII value {expr}
35 pathshorten( {expr}) String shorten directory names in a path
37 List match and submatches of {pat} in {expr}
38 matchstr( {expr}, {pat}[, {start}[, {count}]])
39 String {count}'th match of {pat} in {expr}
40 ! max( {list}) Number maximum value of items in {list}
41 ! min( {list}) Number minimum value of items in {list}
42 ! mkdir( {name} [, {path} [, {prot}]])
43 Number create directory {name}
44 mode( [expr]) String current editing mode
45 + mzeval( {expr}) any evaluate |MzScheme| expression
46 nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum}
47 nr2char( {expr}) String single char with ASCII value {expr}
48 pathshorten( {expr}) String shorten directory names in a path
53 Also see |visualmode()|.
55 + mzeval({expr}) *mzeval()*
56 + Evaluate MzScheme expression {expr} and return its result
57 + convert to Vim data structures.
58 + Numbers and strings are returned as they are.
59 + Pairs (including lists and improper lists) and vectors are
60 + returned as Vim |Lists|.
61 + Hash tables are represented as Vim |Dictionary| type with keys
62 + converted to strings.
63 + All other types are converted to string with display function.
65 + :mz (define l (list 1 2 3))
66 + :mz (define h (make-hash)) (hash-set! h "list" l)
70 + {only available when compiled with the |+mzscheme| feature}
72 nextnonblank({lnum}) *nextnonblank()*
73 Return the line number of the first line at or below {lnum}
74 that is not blank. Example: >
75 *** ../vim-7.2.335/runtime/doc/if_mzsch.txt 2009-06-24 17:51:01.000000000 +0200
76 --- runtime/doc/if_mzsch.txt 2010-01-19 15:33:00.000000000 +0100
79 ! *if_mzsch.txt* For Vim version 7.2. Last change: 2009 Jun 24
82 VIM REFERENCE MANUAL by Sergey Khorev
84 ! *if_mzsch.txt* For Vim version 7.2. Last change: 2010 Jan 19
87 VIM REFERENCE MANUAL by Sergey Khorev
90 1. Commands |mzscheme-commands|
91 2. Examples |mzscheme-examples|
92 3. Threads |mzscheme-threads|
93 ! 4. The Vim access procedures |mzscheme-vim|
94 ! 5. Dynamic loading |mzscheme-dynamic|
96 {Vi does not have any of these commands}
99 1. Commands |mzscheme-commands|
100 2. Examples |mzscheme-examples|
101 3. Threads |mzscheme-threads|
102 ! 4. Vim access from MzScheme |mzscheme-vim|
103 ! 5. mzeval() Vim function |mzscheme-mzeval|
104 ! 6. Dynamic loading |mzscheme-dynamic|
106 {Vi does not have any of these commands}
112 ==============================================================================
113 ! 5. VIM Functions *mzscheme-vim*
116 The 'vimext' module provides access to procedures defined in the MzScheme
120 ==============================================================================
121 ! 4. Vim access from MzScheme *mzscheme-vim*
124 The 'vimext' module provides access to procedures defined in the MzScheme
127 (set-cursor (line . col) [window]) Set cursor position.
129 ==============================================================================
130 ! 5. Dynamic loading *mzscheme-dynamic* *E815*
132 On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
133 output then includes |+mzscheme/dyn|.
135 (set-cursor (line . col) [window]) Set cursor position.
137 ==============================================================================
138 ! 5. mzeval() Vim function *mzscheme-mzeval*
140 ! To facilitate bi-directional interface, you can use |mzeval| function to
141 ! evaluate MzScheme expressions and pass their values to VimL.
143 ! ==============================================================================
144 ! 6. Dynamic loading *mzscheme-dynamic* *E815*
146 On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
147 output then includes |+mzscheme/dyn|.
148 *** ../vim-7.2.335/runtime/doc/usr_41.txt 2008-08-09 19:36:54.000000000 +0200
149 --- runtime/doc/usr_41.txt 2010-01-19 15:29:01.000000000 +0100
153 taglist() get list of matching tags
154 tagfiles() get a list of tags files
156 + mzeval() evaluate |MzScheme| expression
158 ==============================================================================
159 *41.7* Defining a function
161 *** ../vim-7.2.335/src/eval.c 2010-01-19 12:46:51.000000000 +0100
162 --- src/eval.c 2010-01-19 15:48:12.000000000 +0100
165 static long list_find_nr __ARGS((list_T *l, long idx, int *errorp));
166 static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
167 static void list_append __ARGS((list_T *l, listitem_T *item));
168 - static int list_append_tv __ARGS((list_T *l, typval_T *tv));
169 static int list_append_number __ARGS((list_T *l, varnumber_T n));
170 static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
171 static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
175 static void set_ref_in_item __ARGS((typval_T *tv, int copyID));
176 static void dict_unref __ARGS((dict_T *d));
177 static void dict_free __ARGS((dict_T *d, int recurse));
178 - static dictitem_T *dictitem_alloc __ARGS((char_u *key));
179 static dictitem_T *dictitem_copy __ARGS((dictitem_T *org));
180 static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item));
181 - static void dictitem_free __ARGS((dictitem_T *item));
182 static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID));
183 - static int dict_add __ARGS((dict_T *d, dictitem_T *item));
184 static long dict_len __ARGS((dict_T *d));
185 static dictitem_T *dict_find __ARGS((dict_T *d, char_u *key, int len));
186 static char_u *dict2string __ARGS((typval_T *tv, int copyID));
191 static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv));
193 static void f_mode __ARGS((typval_T *argvars, typval_T *rettv));
194 + #ifdef FEAT_MZSCHEME
195 + static void f_mzeval __ARGS((typval_T *argvars, typval_T *rettv));
197 static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv));
198 static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv));
199 static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv));
202 static int var_check_ro __ARGS((int flags, char_u *name));
203 static int var_check_fixed __ARGS((int flags, char_u *name));
204 static int tv_check_lock __ARGS((int lock, char_u *name));
205 - static void copy_tv __ARGS((typval_T *from, typval_T *to));
206 static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID));
207 static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
208 static char_u *trans_function_name __ARGS((char_u **pp, int skip, int flags, funcdict_T *fd));
212 * Append typval_T "tv" to the end of list "l".
213 * Return FAIL when out of memory.
216 list_append_tv(l, tv)
220 * Append typval_T "tv" to the end of list "l".
221 * Return FAIL when out of memory.
224 list_append_tv(l, tv)
229 * Note that the value of the item "di_tv" still needs to be initialized!
230 * Returns NULL when out of memory.
232 ! static dictitem_T *
237 * Note that the value of the item "di_tv" still needs to be initialized!
238 * Returns NULL when out of memory.
247 * Free a dict item. Also clears the value.
255 * Free a dict item. Also clears the value.
263 * Add item "item" to Dictionary "d".
264 * Returns FAIL when out of memory and when key already existed.
271 * Add item "item" to Dictionary "d".
272 * Returns FAIL when out of memory and when key already existed.
281 {"mkdir", 1, 3, f_mkdir},
283 {"mode", 0, 1, f_mode},
284 + #ifdef FEAT_MZSCHEME
285 + {"mzeval", 1, 1, f_mzeval},
287 {"nextnonblank", 1, 1, f_nextnonblank},
288 {"nr2char", 1, 1, f_nr2char},
289 {"pathshorten", 1, 1, f_pathshorten},
293 rettv->v_type = VAR_STRING;
296 + #ifdef FEAT_MZSCHEME
298 + * "mzeval()" function
301 + f_mzeval(argvars, rettv)
306 + char_u buf[NUMBUFLEN];
308 + str = get_tv_string_buf(&argvars[0], buf);
309 + do_mzeval(str, rettv);
314 * "nextnonblank()" function
318 * It is OK for "from" and "to" to point to the same item. This is used to
326 * It is OK for "from" and "to" to point to the same item. This is used to
333 *** ../vim-7.2.335/src/if_mzsch.c 2009-12-16 19:02:05.000000000 +0100
334 --- src/if_mzsch.c 2010-01-19 15:43:05.000000000 +0100
339 static Scheme_Object *vim_to_mzscheme(typval_T *vim_value, int depth,
340 Scheme_Hash_Table *visited);
341 + static int mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth,
342 + Scheme_Hash_Table *visited);
354 + mzscheme_to_vim(Scheme_Object *obj, typval_T *tv, int depth,
355 + Scheme_Hash_Table *visited)
360 + if (depth > 100) /* limit the deepest recursion level */
362 + tv->v_type = VAR_NUMBER;
363 + tv->vval.v_number = 0;
367 + found = (typval_T *)scheme_hash_get(visited, obj);
369 + copy_tv(found, tv);
370 + else if (SCHEME_VOIDP(obj))
372 + tv->v_type = VAR_NUMBER;
373 + tv->vval.v_number = 0;
375 + else if (SCHEME_INTP(obj))
377 + tv->v_type = VAR_NUMBER;
378 + tv->vval.v_number = SCHEME_INT_VAL(obj);
380 + else if (SCHEME_BOOLP(obj))
382 + tv->v_type = VAR_NUMBER;
383 + tv->vval.v_number = SCHEME_TRUEP(obj);
386 + else if (SCHEME_DBLP(obj))
388 + tv->v_type = VAR_FLOAT;
389 + tv->vval.v_float = SCHEME_DBL_VAL(obj);
392 + else if (SCHEME_STRINGP(obj))
394 + tv->v_type = VAR_STRING;
395 + tv->vval.v_string = vim_strsave((char_u *)SCHEME_STR_VAL(obj));
397 + else if (SCHEME_VECTORP(obj) || SCHEME_NULLP(obj)
398 + || SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj))
400 + list_T *list = list_alloc();
406 + Scheme_Object *curr = NULL;
407 + Scheme_Object *cval = NULL;
408 + /* temporary var to hold current element of vectors and pairs */
412 + MZ_GC_VAR_IN_REG(0, curr);
413 + MZ_GC_VAR_IN_REG(1, cval);
416 + tv->v_type = VAR_LIST;
417 + tv->vval.v_list = list;
418 + ++list->lv_refcount;
420 + v = (typval_T *)alloc(sizeof(typval_T));
425 + /* add the value in advance to allow handling of self-referencial
426 + * data structures */
427 + typval_T *visited_tv = (typval_T *)alloc(sizeof(typval_T));
428 + copy_tv(tv, visited_tv);
429 + scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv);
431 + if (SCHEME_VECTORP(obj))
433 + for (i = 0; i < SCHEME_VEC_SIZE(obj); ++i)
435 + cval = SCHEME_VEC_ELS(obj)[i];
436 + status = mzscheme_to_vim(cval, v, depth + 1, visited);
437 + if (status == FAIL)
439 + status = list_append_tv(list, v);
441 + if (status == FAIL)
445 + else if (SCHEME_PAIRP(obj) || SCHEME_MUTABLE_PAIRP(obj))
448 + SCHEME_PAIRP(curr) || SCHEME_MUTABLE_PAIRP(curr);
449 + curr = SCHEME_CDR(curr))
451 + cval = SCHEME_CAR(curr);
452 + status = mzscheme_to_vim(cval, v, depth + 1, visited);
453 + if (status == FAIL)
455 + status = list_append_tv(list, v);
457 + if (status == FAIL)
460 + /* impoper list not terminated with null
461 + * need to handle the last element */
462 + if (status == OK && !SCHEME_NULLP(curr))
464 + status = mzscheme_to_vim(cval, v, depth + 1, visited);
467 + status = list_append_tv(list, v);
472 + /* nothing to do for scheme_null */
478 + else if (SCHEME_HASHTP(obj))
482 + Scheme_Object *key = NULL;
483 + Scheme_Object *val = NULL;
486 + MZ_GC_VAR_IN_REG(0, key);
487 + MZ_GC_VAR_IN_REG(1, val);
490 + dict = dict_alloc();
495 + typval_T *visited_tv = (typval_T *)alloc(sizeof(typval_T));
497 + tv->v_type = VAR_DICT;
498 + tv->vval.v_dict = dict;
499 + ++dict->dv_refcount;
501 + copy_tv(tv, visited_tv);
502 + scheme_hash_set(visited, obj, (Scheme_Object *)visited_tv);
504 + for (i = 0; i < ((Scheme_Hash_Table *)obj)->size; ++i)
506 + if (((Scheme_Hash_Table *) obj)->vals[i] != NULL)
508 + /* generate item for `diplay'ed Scheme key */
509 + dictitem_T *item = dictitem_alloc((char_u *)string_to_line(
510 + ((Scheme_Hash_Table *) obj)->keys[i]));
511 + /* convert Scheme val to Vim and add it to the dict */
512 + if (mzscheme_to_vim(((Scheme_Hash_Table *) obj)->vals[i],
513 + &item->di_tv, depth + 1, visited) == FAIL
514 + || dict_add(dict, item) == FAIL)
516 + dictitem_free(item);
528 + /* `display' any other value to string */
529 + tv->v_type = VAR_STRING;
530 + tv->vval.v_string = (char_u *)string_to_line(obj);
536 + do_mzeval(char_u *str, typval_T *rettv)
539 + Scheme_Object *ret = NULL;
540 + Scheme_Hash_Table *visited = NULL;
543 + MZ_GC_VAR_IN_REG(0, ret);
544 + MZ_GC_VAR_IN_REG(0, visited);
547 + if (mzscheme_init())
554 + visited = scheme_make_hash_table(SCHEME_hash_ptr);
557 + if (eval_with_exn_handling(str, do_eval, &ret) == OK)
558 + mzscheme_to_vim(ret, rettv, 1, visited);
560 + for (i = 0; i < visited->size; ++i)
562 + /* free up remembered objects */
563 + if (visited->vals[i] != NULL)
565 + free_tv((typval_T *)visited->vals[i]);
574 *** ../vim-7.2.335/src/proto/eval.pro 2009-09-30 15:15:33.000000000 +0200
575 --- src/proto/eval.pro 2010-01-19 15:45:39.000000000 +0100
579 void list_free __ARGS((list_T *l, int recurse));
580 dictitem_T *dict_lookup __ARGS((hashitem_T *hi));
581 char_u *list_find_str __ARGS((list_T *l, long idx));
582 + int list_append_tv __ARGS((list_T *l, typval_T *tv));
583 int list_append_dict __ARGS((list_T *list, dict_T *dict));
584 int list_append_string __ARGS((list_T *l, char_u *str, int len));
585 int garbage_collect __ARGS((void));
586 dict_T *dict_alloc __ARGS((void));
587 + dictitem_T *dictitem_alloc __ARGS((char_u *key));
588 + void dictitem_free __ARGS((dictitem_T *item));
589 + int dict_add __ARGS((dict_T *d, dictitem_T *item));
590 int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
591 char_u *get_dict_string __ARGS((dict_T *d, char_u *key, int save));
592 long get_dict_number __ARGS((dict_T *d, char_u *key));
596 void new_script_vars __ARGS((scid_T id));
597 void init_var_dict __ARGS((dict_T *dict, dictitem_T *dict_var));
598 void vars_clear __ARGS((hashtab_T *ht));
599 + void copy_tv __ARGS((typval_T *from, typval_T *to));
600 void ex_echo __ARGS((exarg_T *eap));
601 void ex_echohl __ARGS((exarg_T *eap));
602 void ex_execute __ARGS((exarg_T *eap));
603 *** ../vim-7.2.335/src/proto/if_mzsch.pro 2009-12-16 19:02:05.000000000 +0100
604 --- src/proto/if_mzsch.pro 2010-01-19 15:29:01.000000000 +0100
608 void *mzvim_eval_string __ARGS((char_u *str));
609 int mzthreads_allowed __ARGS((void));
610 void mzscheme_main __ARGS((void));
611 + void do_mzeval __ARGS((char_u *str, typval_T *rettv));
612 /* vim: set ft=c : */
613 *** ../vim-7.2.335/src/testdir/Make_dos.mak 2009-11-17 17:57:10.000000000 +0100
614 --- src/testdir/Make_dos.mak 2010-01-19 15:43:48.000000000 +0100
617 test42.out test52.out test65.out test66.out test67.out \
618 test68.out test69.out
620 ! SCRIPTS32 = test50.out
622 SCRIPTS_GUI = test16.out
625 test42.out test52.out test65.out test66.out test67.out \
626 test68.out test69.out
628 ! SCRIPTS32 = test50.out test70.out
630 SCRIPTS_GUI = test16.out
632 *** ../vim-7.2.335/src/testdir/Make_ming.mak 2009-11-17 17:57:10.000000000 +0100
633 --- src/testdir/Make_ming.mak 2010-01-19 15:29:01.000000000 +0100
636 test42.out test52.out test65.out test66.out test67.out \
637 test68.out test69.out
639 ! SCRIPTS32 = test50.out
641 SCRIPTS_GUI = test16.out
644 test42.out test52.out test65.out test66.out test67.out \
645 test68.out test69.out
647 ! SCRIPTS32 = test50.out test70.out
649 SCRIPTS_GUI = test16.out
657 + -$(DEL) mzscheme.vim
661 *** ../vim-7.2.335/src/testdir/Makefile 2009-11-17 17:40:34.000000000 +0100
662 --- src/testdir/Makefile 2010-01-19 15:29:01.000000000 +0100
665 test54.out test55.out test56.out test57.out test58.out \
666 test59.out test60.out test61.out test62.out test63.out \
667 test64.out test65.out test66.out test67.out test68.out \
670 SCRIPTS_GUI = test16.out
673 test54.out test55.out test56.out test57.out test58.out \
674 test59.out test60.out test61.out test62.out test63.out \
675 test64.out test65.out test66.out test67.out test68.out \
676 ! test69.out test70.out
678 SCRIPTS_GUI = test16.out
682 $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
685 ! -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim test.ok X* valgrind.pid* viminfo
688 ! -rm -f $*.failed tiny.vim small.vim mbyte.vim test.ok X* viminfo
689 $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in
690 @/bin/sh -c "if diff test.out $*.ok; \
691 then mv -f test.out $*.out; \
693 $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
696 ! -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* valgrind.pid* viminfo
699 ! -rm -f $*.failed tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* viminfo
700 $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in $*.in
701 @/bin/sh -c "if diff test.out $*.ok; \
702 then mv -f test.out $*.out; \
703 *** ../vim-7.2.335/src/testdir/main.aap 2004-06-13 21:05:31.000000000 +0200
704 --- src/testdir/main.aap 2010-01-19 15:29:01.000000000 +0100
707 $Scripts $ScriptsGUI: $VimProg
710 ! :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim test.ok X*
712 # test1 is special, it checks for features
714 ! :del {force} test1.failed tiny.vim small.vim mbyte.vim
715 :sys {i} $VimProg -u unix.vim -U NONE --noplugin -s dotest.in test1.in
716 @if os.system("diff test.out test1.ok") != 0:
717 :error test1 FAILED - Something basic is wrong
719 $Scripts $ScriptsGUI: $VimProg
722 ! :del {r}{force} *.out test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X*
724 # test1 is special, it checks for features
726 ! :del {force} test1.failed tiny.vim small.vim mbyte.vim mzscheme.vim
727 :sys {i} $VimProg -u unix.vim -U NONE --noplugin -s dotest.in test1.in
728 @if os.system("diff test.out test1.ok") != 0:
729 :error test1 FAILED - Something basic is wrong
730 *** ../vim-7.2.335/src/testdir/test1.in 2004-06-13 20:19:23.000000000 +0200
731 --- src/testdir/test1.in 2010-01-19 15:38:44.000000000 +0100
736 If Vim was not compiled with the +multi_byte feature, the mbyte.vim script will be set like small.vim above. mbyte.vim is sourced by tests that require the
738 + Similar logic is applied to the +mzscheme feature, using mzscheme.vim.
741 :" Write a single line to test.out to check if testing works at all.
749 :" If +multi_byte feature supported, make mbyte.vim empty.
750 :if has("multi_byte") | sp another | w! mbyte.vim | q | endif
751 + :" If +mzscheme feature supported, make mzscheme.vim empty.
752 + :if has("mzscheme") | sp another | w! mzscheme.vim | q | endif
753 :" If +eval feature supported quit here, leaving tiny.vim and small.vim empty.
754 :" Otherwise write small.vim to skip the test.
756 *** ../vim-7.2.335/src/testdir/test70.in 2010-01-19 15:47:24.000000000 +0100
757 --- src/testdir/test70.in 2010-01-19 15:29:01.000000000 +0100
761 + Smoke test for MzScheme interface and mzeval() function
765 + :set nocompatible viminfo+=nviminfo
766 + :function! MzRequire()
767 + :redir => l:mzversion
770 + :if strpart(l:mzversion, 1, 1) < "4"
771 + :" MzScheme versions < 4.x:
772 + :mz (require (prefix vim- vimext))
775 + :mz (require (prefix-in vim- 'vimext))
779 + :silent call MzRequire()
780 + :mz (define l '("item0" "dictionary with list OK" "item2"))
781 + :mz (define h (make-hash))
782 + :mz (hash-set! h "list" l)
784 + :" change buffer contents
785 + :mz (vim-set-buff-line (vim-eval "line('.')") "1 changed line 1")
787 + :let tmp_string = mzeval('"string"')
788 + :let tmp_1000 = mzeval('1000')
789 + :if tmp_string . tmp_1000 == "string1000"
790 + :let scalar_res = "OK"
792 + :let scalar_res = "FAILED"
794 + :call append(search("^1"), "scalar test " . scalar_res)
795 + :" dictionary containing a list
796 + :let tmp = mzeval("h")["list"][1]
798 + :" circular list (at the same time test lists containing lists)
799 + :mz (set-car! (cddr l) l)
800 + :let l2 = mzeval("h")["list"]
804 + :let res = "FAILED"
806 + :call setline(search("^3"), "circular test " . res)
814 *** ../vim-7.2.335/src/testdir/test70.ok 2010-01-19 15:47:24.000000000 +0100
815 --- src/testdir/test70.ok 2010-01-19 15:29:01.000000000 +0100
822 + dictionary with list OK
824 *** ../vim-7.2.335/src/version.c 2010-01-19 15:23:38.000000000 +0100
825 --- src/version.c 2010-01-19 15:46:44.000000000 +0100
829 { /* Add new patch number below this line */
835 "Computers in the future may weigh no more than 1.5 tons."
836 Popular Mechanics, 1949
838 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
839 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
840 \\\ download, build and distribute -- http://www.A-A-P.org ///
841 \\\ help me help AIDS victims -- http://ICCF-Holland.org ///